XML元素和命名空间

时间:2009-09-21 04:23:05

标签: c# xml

我有以下方法来解析XMLElements:

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

在调试模式下,我可以将root视为XML:

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

和var name为null(我希望得到“item 1”)。我试图使用“a:Name”但它引起异常(“字符:不能在名称中使用”)。我不确定是否必须在root XElelement中设置名称空间。 root下的所有xml节点都应位于同一名称空间中。

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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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的生成方式,那么这不会成为问题。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

您需要为XElements声明XNamespace,就像在这些MSDN示例中一样:Element()XName