我知道没有直接的方法,但仍然可以。 我们可以将XElement
元素转换为XmlNode
。 选项如InnerText
和InnerXml
分别是XmlNode
。将XElement转换为XmlNode
所以,如果我想要使用这些选项,可以做些什么来将XElement
转换为XmlNode
,反之亦然。
我知道没有直接的方法,但仍然可以。 我们可以将XElement
元素转换为XmlNode
。 选项如InnerText
和InnerXml
分别是XmlNode
。将XElement转换为XmlNode
所以,如果我想要使用这些选项,可以做些什么来将XElement
转换为XmlNode
,反之亦然。
这里是从字符串转换的XElement到XmlNode的和回的XElement。 XElement上的ToString()与XmlNode上的OuterXml类似。
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);
有办法从得到的XElement InnerXml - 见Best way to get InnerXml of an XElement?
我用下面的扩展方法,他们似乎是相当普遍:
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;
}
}
}
真棒:)这是很大的帮助 – 2011-10-29 21:34:36
我必须使'ToXmlNode'返回'xmlDoc.DocumentElement'来获得我期望的行为。特别是,我的'XElement'有注释,但是我的'XmlNode'没有注释。否则非常有帮助。 – tallseth 2014-02-21 14:03:07
'return xmlDoc;'应该被修正为'return xmlDoc.FirstChild;' – 2017-09-04 07:01:41
基于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);
}
}
}
注意:如果您尝试在文档中插入由不同文档创建的节点,则会引发异常:“要插入的节点来自不同的文档集XT“。
我想在最短的方式如下:
Dim xn as XmlNode = xdoc.ReadNode(xElem.CreateReader)
这就是所有!
你也可以使用ImportNode https://msdn.microsoft.com/en-us/library/system.xml.xmldocument.importnode(v=vs.110).aspx – seabass 2018-03-07 13:23:30