Как преобразовать XmlNode в XElement?
У меня есть старый XmlNode
код. но самый простой способ решить мою текущую задачу - использовать XElement
и LINQ-to-XML. Единственная проблема заключается в том, что нет прямого или очевидного метода для преобразования XmlNode
в XElement
в .NET Framework.
Итак, для начала я хочу реализовать метод, который получает экземпляр XmlNode
и преобразует его в экземпляр XElement
.
Как я могу реализовать это преобразование?
Ответы
Ответ 1
var xElem = XElement.Load( xmlElement.CreateNavigator().ReadSubtree() );
Есть две проблемы с xmlElement.InnerXml, используемые в другом ответе,
1 - Вы потеряете корневой элемент (конечно, его можно легко обрабатывать)
XmlDocument doc = new XmlDocument();
doc.LoadXml("<root> <sub>aaa</sub> </root>");
var xElem1 = XElement.Load(doc.DocumentElement.CreateNavigator().ReadSubtree());
var xElem2 = XElement.Parse(doc.DocumentElement.InnerXml);
xElem2
будет <sub>aaa</sub>
, без (root
)
2 - Вы получите исключение, если ваш xml содержит текстовые узлы
XmlDocument doc = new XmlDocument();
doc.LoadXml("<root> text <sub>aaa</sub> </root>");
var xElem1 = XElement.Load(doc.DocumentElement.CreateNavigator().ReadSubtree());
var xElem2 = XElement.Parse(doc.DocumentElement.InnerXml); //<-- XmlException
Ответ 2
Вы можете попробовать использовать InnerXml
свойство XmlElement
, чтобы получить содержимое xml вашего элемента, затем проанализируйте его на XElement
, используя XElement.Parse
:
public static XElement ToXELement(this XmlElement source)
{
return XElement.Parse(source.InnerXml);
}
Ответ 3
На самом деле существует очень простой способ преобразования XNode в XElement:
static XElement ToXElement( XNode node)
{
return node as XElement; // returns null if node is not an XElement
}
Если вы на 100% уверены, что node является XElement (или вы готовы справиться с исключением, если это не так, вы можете просто сделать: (XElement)node
.
Ответ 4
Насколько я знаю, вы можете сделать это:
XElement xdoc = new XElement(node.Name, node.InnerXml);