XML с / без пространства имен - PullRequest
1 голос
/ 02 декабря 2011

Технически ли следующие 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 ]

1 голос
/ 25 января 2013

Эти два документа семантически идентичны.В XML есть две вещи, о которых следует подумать: URI пространства имен (часть «http: // ...») и псевдоним (часть «ns2».)

При запросе документа XML,в любом документе, если вы попытаетесь найти «sampleledata» без назначения пространства имен узлу, вы не найдете его.

В классах .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;

В этом примере значения count1 и count2 равны 1.

0 голосов
/ 02 декабря 2011

Нет, технически это не так.

  • Пространством имен по умолчанию для второго документа является пустая строка.
  • Первый документ не знает о префиксе 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>

соответственно.

Но если вы убедитесь, что обаxmlns и xmlns:ns2 известны обоим документам, тогда формат вывода будет одинаковым:

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