C # XML - объявление нескольких пространств имен с помощью XML Writer - PullRequest
5 голосов
/ 26 октября 2011

Я пытаюсь создать XML-документ с несколькими пространствами имен, используя System.Xml.Xmlwriter в C #, и получаю следующую ошибку при компиляции:

Префикс '' не может быть переопределен из ''в 'http://www.acme.com/BOF' внутри того же тега начального элемента.

Ниже приведен полный код:

        XmlWriterSettings settings = new XmlWriterSettings { Encoding = Encoding.UTF8, Indent = true };

        XmlWriter writer = XmlWriter.Create("C:\\ACME\\xml.xml", settings);

        writer.WriteStartDocument();

        writer.WriteStartElement("BOF");
        writer.WriteAttributeString("xmlns", null, null, "http://www.acme.com/BOF");  //This is where I get my error
        writer.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance");
        writer.WriteAttributeString("fileName", null, null, "test.xml");
        writer.WriteAttributeString("date", null, null, "2011-10-25");
        writer.WriteAttributeString("origin", null, null, "MYORIGIN");
        writer.WriteAttributeString("ref", null, null, "XX_88888");
        writer.WriteEndElement();

        writer.WriteStartElement("CustomerNo");
        writer.WriteString("12345");
        writer.WriteEndElement();

        writer.WriteEndDocument();

        writer.Flush();
        writer.Close();

Что я делаю не так?

Спасибо

Джон

Ответы [ 3 ]

7 голосов
/ 26 октября 2011
writer.WriteStartElement("BOF"); // write element name BOF, no prefix, namespace ""
writer.WriteAttributeString("xmlns", null, null, "http://www.acme.com/BOF");  //Set namespace for no prefix to "http://www.acme.com/BOF".

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

Заменитьэти две строки с writer.WriteStartElement("BOF", "http://www.acme.com/BOF")

3 голосов
/ 26 октября 2011

Вы должны передать ваше пространство имен по умолчанию методу WriteStartElement.

0 голосов
/ 10 февраля 2018
writer.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance");

Должен быть записан как

writer.WriteAttributeString("xsi", "http://www.w3.org/2000/xmlns/", "http://www.w3.org/2001/XMLSchema-instance");

В этом случае префикс xsi регистрируется в таблице имен XML. Дальнейшее использование http://www.w3.org/2001/XMLSchema-instance для параметра ns при методе XmlWriter будет предшествовать префиксу пространства имен XML xsi.

URI пространства имен XML xsi также доступен в .NET с константой System.Xml.Schema.XmlSchema.InstanceNamespace.

...