Управление порядком пространств имен XML - PullRequest
2 голосов
/ 07 апреля 2009

У меня проблема с отображением «xmlns» первым в списке корневых атрибутов.

Я получаю это:

  <myroot 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://www.someurl.com/ns/myroot http://www.someurl.com/xml/schemas/myschema.xsd"
        xmlns="http://www.someurl.com/ns/myroot"> 

       <sometag>somecontent</sometag>

    </myroot>

И я хочу это:

<myroot 
        xmlns="http://www.someurl.com/ns/myroot" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://www.someurl.com/ns/myroot http://www.someurl.com/xml/schemas/myschema.xsd">

       <sometag>somecontent</sometag>

    </myroot>

Мой код выглядит так:

  XNamespace rt = "http://www.someurl.com/ns/myroot";
        XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance";

        var submissionNode = new XElement(XmlNameSpaces.rt + "myroot");
        submissionNode.Add(new XAttribute(XNamespace.Xmlns + "xsi", "http://www.w3.org/2001/XMLSchema-instance"));
        submissionNode.Add(new XAttribute(xsi + "schemaLocation", @"http://www.someurl.com/ns/myroot http://www.someurl.com/xml/schemas/myschema.xsd"););

Что мне нужно сделать, чтобы изменить порядок?

РЕДАКТИРОВАТЬ: Я понимаю, что заказ обычно не является относительным, но это требование в этом случае.

Ответы [ 6 ]

2 голосов
/ 07 апреля 2009

Будет ли XmlWriter вариант для вас?

Afaik, он дает вам полный контроль над порядком атрибутов и объявлений пространства имен.

1 голос
/ 29 марта 2016

У меня есть клиент с этой самой проблемой. Это была боль в s , поэтому я написал обходной путь, чтобы решить эту проблему.

Обратите внимание, что это не красивое решение, и это не должно поощряться, но работает.

public static class MyKludgeXmlClass
{
    public static XmlDocument CreateXmlDocumentWithOrderedNamespaces()
    {
        var xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?><MyRoot xmlns=\"http://www.example.com/schemas/1.0/VRSync\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.example.com/schemas/1.0/VRSync http://xml.example.com/vrsync.xsd\"></MyRoot>";
        System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
        doc.LoadXml(xml);

        return doc;
    }
}

С помощью XmlDocument вы можете получить корень:

var xmlDoc = MyKludgeXmlClass.CreateXmlDocumentWithOrderedNamespaces();
XmlElement root = xmlDoc.DocumentElement;

И добавляйте дочерние узлы, используя ваш любимый метод.

1 голос
/ 07 апреля 2009

IIRC, порядок атрибутов (в xml) не важен ... так зачем его менять? Это вызывает реальную проблему?

0 голосов
/ 23 октября 2016

Потому что иногда правильный ответ таков: нет, не делайте этого ...

Per Пространства имен W3C в XML Рекомендации , раздел 3 Объявление пространств имен :

[Определение: пространство имен (или, точнее, привязка пространства имен) объявлено с использованием семейства зарезервированных атрибутов. Имя такого атрибута должно быть либо xmlns , либо начинаться xmlns: . Эти атрибуты, как и любые другие атрибуты XML, могут быть предоставлены напрямую или по умолчанию . ]

Следовательно, порядок объявлений пространства имен, как и порядок любых атрибутов , незначителен .

Таким образом, ни один совместимый инструмент или библиотека XML не будет заботиться о порядке объявлений пространств имен, и вы не должны.

0 голосов
/ 07 апреля 2009

Программное обеспечение, которое требует, чтобы атрибуты были в указанном порядке, не соответствует рекомендации XML.

Первый вопрос, который вам следует задать, это не «Как я могу создать XML с атрибутами пространства имен в определенном порядке?» Вместо этого следует сказать: «В каких других отношениях это программное обеспечение не соответствует рекомендации XML?» Потому что я поставлю вам один новый американский доллар, что, если процесс получателя нарушает рекомендацию XML в одном отношении, он нарушает его как минимум в одном другом.

0 голосов
/ 07 апреля 2009

Порядок атрибутов НЕ указан в документе XML, и на него не следует полагаться. Может быть стоит посмотреть на спецификацию

Вы обнаружите, что если вы читаете XML-документ в DOM и записываете его, независимо от платформы / библиотеки, вы не можете (и не должны) полагаться на порядок атрибутов. Это распространенное заблуждение, кстати!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...