Преобразование XElement в XmlNode
Я знаю, что нет прямого метода делать это, но все же..
Можем ли мы преобразовать элемент XElement
в XmlNode
.
Параметры типа InnerText
и InnerXml
имеют значение XmlNode
.
поэтому, если я хочу использовать эти параметры, что можно сделать для преобразования XElement
в XmlNode
и наоборот.
Ответы
Ответ 1
Здесь выполняется преобразование из строки в XElement в XmlNode и обратно в XElement. ToString() в XElement похож на OuterXml на XmlNode.
XElement xE = XElement.Parse("<Outer><Inner><Data /></Inner></Outer>");
XmlDocument xD = new XmlDocument();
xD.LoadXml(xE.ToString());
XmlNode xN = xD.FirstChild;
XElement xE2 = XElement.Parse(xN.OuterXml);
Ответ 2
Я использую следующие методы расширения, они кажутся довольно распространенными:
public static class MyExtensions
{
public static XElement ToXElement(this XmlNode node)
{
XDocument xDoc = new XDocument();
using (XmlWriter xmlWriter = xDoc.CreateWriter())
node.WriteTo(xmlWriter);
return xDoc.Root;
}
public static XmlNode ToXmlNode(this XElement element)
{
using (XmlReader xmlReader = element.CreateReader())
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(xmlReader);
return xmlDoc;
}
}
}
Ответ 3
На основе BrokenGlass answer, если вы хотите внедрить XmlNode в XmlDocument, используйте:
public static class MyExtensions
{
public static XmlNode ToXmlNode(this XElement element, XmlDocument xmlDoc = null)
{
using (XmlReader xmlReader = element.CreateReader())
{
if(xmlDoc==null) xmlDoc = new XmlDocument();
return xmlDoc.ReadNode(xmlReader);
}
}
}
Примечание. Если вы попытаетесь вставить в документ node, который создается другим документом, то он будет генерировать исключение: "Вставляемый node - из другого контекста документа".
Ответ 4
Я думаю, что самый короткий путь следующий:
Dim xn as XmlNode = xdoc.ReadNode(xElem.CreateReader)
Все это! Конвертировать в С# тривиально.
Ответ 5
Есть способы получить InnerXml из XElement - см. Лучший способ получить InnerXml XElement?
Ответ 6
XElement xelement = GetXElement();
XmlNode node = new XmlDocument().ReadNode(xelement.CreateReader()) as XmlNode;