【问题标题】:XML Element and NamespaceXML 元素和命名空间
【发布时间】: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。

标签: c# 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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-02-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多