2011-12-02 79 views
1

以下XML文档在技术上是否相同?带/不带命名空间的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> 
+0

我认为......是相同的。 –

回答

0

不,他们在技术上没有。

  • 第二个文档的默认命名空间是一个空字符串。
  • 第一个文档不知道有关ns2前缀。

这可以通过确保两个xmlns:ns2="http://www.mycompany.com"xmlns="http://www.mycompany.com"存在于两个文件是固定的,尽管只有一个会在每个被使用。

但是,就查询这些XML而言,是的,它们是相同的。
嗯,不完全是。
将找到节点,但输出格式将会不同(至少,使用.NET xml)。举例来说,如果查询"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> 
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