Подтвердить что ты не робот

Как преобразовать XmlNode в XElement?

У меня есть старый XmlNode код. но самый простой способ решить мою текущую задачу - использовать XElement и LINQ-to-XML. Единственная проблема заключается в том, что нет прямого или очевидного метода для преобразования XmlNode в XElement в .NET Framework.

Итак, для начала я хочу реализовать метод, который получает экземпляр XmlNode и преобразует его в экземпляр XElement.

Как я могу реализовать это преобразование?

4b9b3361

Ответ 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);