将 XElement 转换为 XmlNode
Posted
技术标签:
【中文标题】将 XElement 转换为 XmlNode【英文标题】:Converting XElement into XmlNode 【发布时间】:2011-07-20 08:36:25 【问题描述】:我知道没有直接的方法,但仍然..
我们可以将XElement
元素转换为XmlNode
。
InnerText
和 InnerXml
等选项是 XmlNode
特定的。
所以,如果我想使用这些选项,可以将XElement
转换为XmlNode
,反之亦然。
【问题讨论】:
有一些方法可以从 XElement 获取 InnerXml - 请参阅 ***.com/questions/3793/… 【参考方案1】:我使用以下扩展方法,它们似乎很常见:
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;
【讨论】:
我必须让ToXmlNode
返回xmlDoc.DocumentElement
才能得到我期望的行为。特别是,我的XElement
有注释,但我的XmlNode
没有。否则非常有帮助。
return xmlDoc;
应更正为return xmlDoc.FirstChild;
【参考方案2】:
这里是从字符串到 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);
【讨论】:
你也可以使用 ImportNode msdn.microsoft.com/en-us/library/…【参考方案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);
注意:如果您尝试向文档中插入由不同文档创建的节点,则会引发异常:“要插入的节点来自不同的文档上下文。”
【讨论】:
【参考方案4】:我认为最短的方法是:
Dim xn as XmlNode = xdoc.ReadNode(xElem.CreateReader)
就是这样!转换为 C# 很简单。
【讨论】:
【参考方案5】:XElement xelement = GetXElement();
XmlNode node = new XmlDocument().ReadNode(xelement.CreateReader()) as XmlNode;
【讨论】:
以上是关于将 XElement 转换为 XmlNode的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET MVC4 Web API MediaTypeFormatter 转换器将 XElement 转换为 JSON