我知道没有直接的方法可以做到这一点,但仍然.. 我们可以将
XElement
元素转换为 XmlNode
吗?
InnerText
和 InnerXml
等选项是 XmlNode
特定的。
所以,如果我想使用这些选项,可以做什么来将
XElement
转换为 XmlNode
,反之亦然。
我使用以下扩展方法,它们似乎很常见:
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;
}
}
}
这里是从字符串到 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);
基于 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);
}
}
}
注意:如果您尝试将由不同文档创建的节点插入到文档中,则会抛出异常:“要插入的节点来自不同的文档上下文。”
XElement xelement = GetXElement();
XmlNode node = new XmlDocument().ReadNode(xelement.CreateReader()) as XmlNode;
我认为最短的方法如下:
Dim xn as XmlNode = xdoc.ReadNode(xElem.CreateReader)
仅此而已!转换为 C# 很简单。
“反之亦然”在 C# 中非常简单,除非我遗漏了一些东西:
My_XML_Element = (XmlElement) My_XML_Node;