XML 元素和命名空间

3
我有以下方法来解析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>
    ...

并且变量名称为null(我希望得到“item 1”)。 我尝试使用“a:Name”,但它引发了异常(“字符:不能用作名称”)。 我不确定是否必须在根XElelement中设置命名空间。 根下的所有xml节点应该在同一个命名空间中。

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


这里的 root 是 XML 的实际根节点吗?也就是说,你收到的 XML 片段是完整的 XML 文档吗?如果是,那么它就不是有效的 XML。 - Pavel Minaev
4个回答

4

您需要使用包含命名空间的元素名称。请尝试以下内容:

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

3

您需要在根元素中定义“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,则不会出现问题。

0
你需要创建一个具有非空命名空间的XNames。为此,你必须创建一个XNamespace,并添加元素名称,请参见在命名空间中创建XName

0
如果您使用包含命名空间的XML数据,则需要声明这些命名空间。 (这是我做出的一般观察,即使似乎很难“仅查看”您不了解的数据)。
您需要为XElements声明XNamespace,就像在这些MSDN示例中一样:Element()XName

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接