代码之家  ›  专栏  ›  技术社区  ›  izb

为什么我不能从XPathNavigator中检索属性值?

  •  1
  • izb  · 技术社区  · 16 年前

    我有这样的XML:

    <?xml version="1.0"?>
    <a xmlns="http://mynamespace">
      <b>
        <c val="test" />
      <b>
    </a>
    

    我正试图找到“c”标记上“val”属性的值,如下所示:

    XmlDocument doc = new XmlDocument();
    doc.Load("myxml.xml");
    
    nsMgr = new XmlNamespaceManager(doc.NameTable);
    nsMgr.AddNamespace(@"mns", "http://mynamespace");
    
    XPathNavigator root = doc.CreateNavigator();
    
    foreach (XPathNavigator nav in root.Select("//mns:c", nsMgr))
    {
        string val = nav.GetAttribute("val", NS);
    
        Console.WriteLine("val == "+val);
    }
    


    更新:

    似乎我可以通过向GetAttribute传递一个空字符串来解决这个问题。

    string val = nav.GetAttribute("val", "");
    

    因此,我现在的问题是:为什么这样做?为什么“val”不属于我的命名空间,尽管XML已经根据需要“val”属性的模式进行了验证(我在上面的示例代码中意外地省略了这一步,但我正在验证XML)。

    2 回复  |  直到 16 年前
        1
  •  3
  •   Martin Honnen    16 年前

    默认名称空间声明不应用于属性,因此名为“val”的属性不在名称空间中,如果要访问它,则需要在不使用名称空间的情况下访问它。 在名称空间中放置属性的唯一方法是给它一个带前缀的限定名和本地名(例如pf:val),其中前缀绑定到一个名称空间(例如xmlns:pf=)http://example.com/foo").

        2
  •  3
  •   izb    16 年前

    attributeFormDefault="qualified"
    

    attributeFormDefault="unqualified"
    

    默认情况下,它似乎是“unqualified”,也就是说属性从不属于任何名称空间,只属于元素(自然地由elementFormDefault值控制)。

    默认情况下,强制限定属性会强制任何XML在属于该模式的所有属性上都需要前缀。

    第6.3节对此进行了部分解释 here 它还声明默认名称空间不能应用于属性-它们必须有前缀,而不是元素。