XML 元素和命名空间

Posted

技术标签:

【中文标题】XML 元素和命名空间【英文标题】:XML Element and Namespace 【发布时间】:2009-09-21 04:23:05 【问题描述】:

我有以下方法来解析 XMLElements:

DisplayMessages(XElement root)

  var items = root.Descendants("Item");
  foreach (var item in items)
  
     var name = item.Element("Name");
     ....
  

在调试模式下,我可以像这样看到根为 XML:

<ItemInfoList>
  <ItemInfo>
    <Item>
      <a:Name>item 1</a:Name>
      ...
    <Item>
    ...

并且 var name 为空(我希望得到“项目 1”)。我尝试使用“a:Name”,但它导致异常(“字符:不能在名称中使用”)。我不确定是否必须在根 XElelement 中设置命名空间。 root 下的所有 xml 节点都应该在同一个命名空间中。

我是 XElement 的新手。在我的代码中,item.Element("Name") 将获取其子节点“Name”的值,对吗?

【问题讨论】:

root 这里是 XML 的实际根节点吗?即,您的 XML sn-p 是您收到的完整 XML 文档吗?如果是,那么它就是无效的 XML。 【参考方案1】:

您需要使用包含命名空间的元素名称。试试这个:

static void DisplayMessages(XElement root)

    var items = root.Descendants(root.GetDefaultNamespace() + "Item");
    foreach (var item in items)
    
        var name = item.Element(item.GetNamespaceOfPrefix("a") + "Name");
        Console.WriteLine(name.Value);
    

请注意,operator + 已为 XNamespace 类重载以缩短代码:XNamespace.Addition Operator。

【讨论】:

【参考方案2】:

您确实需要在根元素中定义“a”命名空间:

<Root a:xmlns="http:///someuri.com">
...
</Root>

然后您可以在 LINQ to XML 中使用以下语法选择非默认命名空间中的元素:

XNamespace a = "http:///someuri.com"; // must match declaration in document
...
var name = item.Element(a + "Name");

编辑:

检索默认命名空间:

XNamespace defaultNamespace = document.Root.GetDefaultNamespace();
// XNamespace.None is returned when default namespace is not explicitly declared

要查找其他命名空间声明:

var declarations = root.Attributes().Where(a => a.IsNamespaceDeclaration);

请注意,命名空间可以在任何元素上声明,因此您需要递归搜索文档中的所有元素以查找所有命名空间声明。实际上,虽然这通常在根元素中完成,但如果您可以控制 XML 的生成方式,那么这将不是问题。

【讨论】:

【参考方案3】:

您需要创建具有非空命名空间的 XName。为此,您必须创建一个 XNamespace,并添加元素名称,请参阅 Creating an XName in a Namespace。

【讨论】:

【参考方案4】:

如果您使用包含命名空间的 XML 数据,则需要声明这些命名空间。 (这是我所做的一般性观察,尽管它似乎很难“看一看”你不知道的数据)。

您需要为您的 XElement 声明一个 XNamespace,如以下 MSDN 示例中所示:Element()、XName

【讨论】:

以上是关于XML 元素和命名空间的主要内容,如果未能解决你的问题,请参考以下文章

XML名命空间

从 xml 的元素中提取命名空间属性

元素中 XML 命名空间的错误输出

XML 命名空间

XML和Schema命名空间详解

『XML』XML/XSD命名空间解析