带/不带命名空间的XML

时间:2011-12-02 19:03:27

标签: xml namespaces

以下XML文档在技术上是否相同?

<sampledata xmlns="http://www.mycompany.com">
    <firstname>James</firstname>
    <lastName>Dean</lastName>
    <age>19</age>
</sampledata>

<ns2:sampledata xmlns:ns2="http://www.mycompany.com">
    <ns2:firstname>James</firstname>
    <ns2:lastName>Dean</lastName>
    <ns2:age>19</age>
</ns2:sampledata>

2 个答案:

答案 0 :(得分:1)

这两个文件在语义上是相同的。在XML中,有两件事需要考虑:名称空间URI(“http:// ...”部分)和别名(“ns2”部分。)

在任一文档中查询XML文档时,如果您尝试查找“sampledata”而未向节点分配命名空间,则无法找到它。

在.NET的System.Xml.XmlNode类中,您必须先设置命名空间别名,然后才能查询任何内容。从技术上讲,在查询DOM时,没有理由不能创建别名“foo”并为其分配URI“http://www.mycompany.com”。使用该设置,查询“foo:sampledata”将返回任一文档中的节点。

        XmlDocument doc1 = new XmlDocument();
        doc1.LoadXml(@"
            <sampledata xmlns=""http://www.mycompany.com"">
                <firstname>James</firstname>
                <lastName>Dean</lastName>
                <age>19</age>
            </sampledata>");

        XmlDocument doc2 = new XmlDocument();
        doc2.LoadXml(@"
            <ns2:sampledata xmlns:ns2=""http://www.mycompany.com"">
                <ns2:firstname>James</ns2:firstname>
                <ns2:lastName>Dean</ns2:lastName>
                <ns2:age>19</ns2:age>
            </ns2:sampledata>");

        XmlNamespaceManager nsMgr = new XmlNamespaceManager(new NameTable());
        nsMgr.AddNamespace("foo", "http://www.mycompany.com");

        int count1 = doc1.SelectNodes("foo:sampledata", nsMgr).Count;
        int count2 = doc2.SelectNodes("foo:sampledata", nsMgr).Count;

在此示例中,count1count2均为1。

答案 1 :(得分:0)

不,他们在技术上不是。

  • 第二个文档的默认命名空间是空字符串。
  • 第一个文档不了解ns2前缀。

这可以通过确保两个文档中都包含xmlns:ns2="http://www.mycompany.com"xmlns="http://www.mycompany.com"来解决,尽管每个文档中只会使用一个。

但是,在查询这些XML方面,是的,它们是相同的 嗯,不完全是。
将找到节点,但输出格式将不同(至少使用.NET xml thingies)。例如,如果您查询这两个文档"http://www.mycompany.com":firstname,您将获得

<firstname xmlns="http://www.mycompany.com">James</firstname>

<ns2:firstname xmlns:ns2="http://www.mycompany.com">James</ns2:firstname>

分别

但如果您确保两个文档都知道xmlnsxmlns:ns2,那么输出格式将是相同的:

<firstname xmlns="http://www.mycompany.com">James</firstname>
<firstname xmlns="http://www.mycompany.com">James</firstname>