【问题标题】:XElement and XName crashes when xml has namespace to root node当 xml 具有到根节点的命名空间时,XElement 和 XName 崩溃
【发布时间】:2017-06-30 15:31:58
【问题描述】:

您好,我正在摆弄 xml 文件,但我注意到我有一些问题要解决。

我有一个以根节点开头的 Xml,然后有另一个可以更改名称的子节点,例如:

<root>
  <Child1>
</root>

因此,鉴于“Child1”可以更改为“Child2”或“Child3”,我让这个 linq 能够从我遇到的任何事情中提取名称。

第一:

XElement root = XElement.Parse(xml);

var childType = root.Descendants().First(x => x.Name == "Child1" || x.Name == "Child2"|| x.Name == "Child3").Name;

所以当我的 xml 没有命名空间时,如上所示,它工作正常,我设法从节点标签中提取名称。

但是当我在根标签中有一个命名空间时,它会抛出一个错误:

<root xmlns="namespace">
  <Child1>
</root>

那个xml通过相同的linq,抛出:

序列不包含匹配元素

【问题讨论】:

    标签: c# xml linq xelement


    【解决方案1】:

    您的 root 元素定义了一个命名空间 (xmlns="namespace"),因此所有子元素都与同一个命名空间相关联。 IE。 Child1 元素将在同一个命名空间中,其名称将包含命名空间前缀和本地名称 ("Child1")。因此,您可以在搜索 Child1 元素时指定全名:

    var ns = root.GetDefaultNamespace();
    var childType = root.Descendants()
       .First(x => x.Name == ns +"Child1" || x.Name == ns + "Child2"|| x.Name == ns + "Child3")
       .Name;
    

    或者您可以查找x.Name.LocalName(但我不推荐这种方法,尽管您不太可能拥有来自另一个命名空间的Child1 元素)。

    注意:您的 Child 元素没有结束标记(可能是打印错误)

    延伸阅读:Xml Namespaces

    【讨论】:

    • 这可能是因为命名空间默认使用xmlns=... 可能值得解释。我打算这样做,但认为这将是大部分与您的答案重复...
    • 这工作完美,正是我正在寻找的答案,谢谢。
    猜你喜欢
    • 1970-01-01
    • 2018-12-19
    • 2015-04-16
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多