代码之家  ›  专栏  ›  技术社区  ›  Alexander Abakumov

如何将XmlNode转换为XElement?

  •  28
  • Alexander Abakumov  · 技术社区  · 10 年前

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

    所以对于初学者来说,我想实现一个方法 XmlNode 实例并将其转换为 X元素 例子

    如何实现此转换?

    6 回复  |  直到 9 年前
        1
  •  20
  •   EZI    10 年前
    var xElem = XElement.Load( xmlElement.CreateNavigator().ReadSubtree() );
    

    有两个问题 xml元素内部XML 在其他回答中使用,

    1- 你会松开 元素(当然,它很容易处理)

    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
    
        2
  •  5
  •   Selman Genç    10 年前

    您可以尝试使用 InnerXml 的属性 XmlElement 获取元素的xml内容,然后将其解析为 XElement 使用 XElement.Parse :

    public static XElement ToXELement(this XmlElement source)
    {
        return XElement.Parse(source.InnerXml);
    }
    
        3
  •  1
  •   Trivalik    4 年前

    接管一切的唯一方法是使用OuterXml。

    XElement.Parse(xNode.OuterXml);
    

    另一种方法是通过更改外部根元素。

    XElement.Parse("<NewRoot>" + xNode.InnerXml + "</NewRoot>");
    
        4
  •  -1
  •   Gustavo Lemos    6 年前

    只需使用它: X元素 电子= X元素 .Load(node.CreateReader());

    我希望这有帮助。

    例子:

    A real code example 上面的图像代码

    公共静态XNode GetNodeByFilter(XNode节点,ref SortedList筛选器,int位置=1) {

    XNode结果=空;

            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;
        }
    
        5
  •  -3
  •   Mark Moore    7 年前

    实际上有一个 非常 将XNode转换为XElement的简单方法:

    static XElement ToXElement( XNode node)
    {
        return node as XElement; // returns null if node is not an XElement
    }
    

    如果您100%确定该节点是一个XElement(如果不是,则准备处理异常),那么您可以简单地转换: (XElement)node .

        6
  •  -9
  •   MJVC    10 年前

    据我所知,你可以这样做:

    XElement xdoc = new XElement(node.Name, node.InnerXml);