如何将XmlNode转换为XElement?

时间:2014-07-14 19:05:57

标签: c# .net linq linq-to-xml

我有一个旧的基于XmlNode的代码。但解决当前任务的最简单方法是使用XElement和LINQ-to-XML。唯一的问题是在.NET Framework中没有直接或明显的方法将XmlNode转换为XElement

首先,我希望实现一个接收XmlNode实例并将其转换为XElement实例的方法。

如何实施此转化?

6 个答案:

答案 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);
相关问题