我有一个旧的基于XmlNode
的代码。但解决当前任务的最简单方法是使用XElement
和LINQ-to-XML。唯一的问题是在.NET Framework中没有直接或明显的方法将XmlNode
转换为XElement
。
首先,我希望实现一个接收XmlNode
实例并将其转换为XElement
实例的方法。
如何实施此转化?
答案 0 :(得分:18)
var xElem = XElement.Load( xmlElement.CreateNavigator().ReadSubtree() );
在其他答案中使用 xmlElement.InnerXml 有两个问题,
1 - 您将丢失 root 元素(当然,它可以轻松处理)
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
答案 1 :(得分:4)
您可以尝试使用XmlElement
的{{3}}属性获取元素的xml内容,然后使用InnerXml
将其解析为XElement
:
public static XElement ToXELement(this XmlElement source)
{
return XElement.Parse(source.InnerXml);
}
答案 2 :(得分:0)
接管一切的唯一方法是使用 OuterXml。
XElement.Parse(xNode.OuterXml);
另一种方法是通过改变外部根元素。
XElement.Parse("<NewRoot>" + xNode.InnerXml + "</NewRoot>");
答案 3 :(得分:-1)
只需使用它: XElement e = XElement .Load(node.CreateReader());
我希望有帮助。
示例:
A real code example 上面的图片代码
公共静态XNode GetNodeByFilter(XNode节点,ref SortedList过滤器,int位置= 1) {
XNode结果= null;
if (filter.TryGetValue(position, out XMLSearchCriteria criteria)) { while (node != null) { XElement e = XElement.Load(node.CreateReader()); if (e.Name.LocalName.Equals(criteria.Node) && CheckIfAllAttributesMatch(e.Attributes(), criteria.Attributes)) { if (++position <= filter.Count) { result = GetNodeByFilter(e.FirstNode, ref filter, position); break; } else { result = node; } } node = node.NextNode; } } return result; }
答案 4 :(得分:-2)
实际上有一种非常直接的方式将XNode转换为XElement:
static XElement ToXElement( XNode node)
{
return node as XElement; // returns null if node is not an XElement
}
如果您100%确定节点是XElement(或者您准备处理异常,如果不是,那么您可以简单地投射:(XElement)node
。
答案 5 :(得分:-8)
据我所知,你可以这样做:
XElement xdoc = new XElement(node.Name, node.InnerXml);