Добавить начальный элемент с префиксом без пространства имен

Есть ли способ использовать функцию WriteStartElement в XmlWriter следующим образом:

XmlWriter.WriteStartElement("prefix", "name", null);

Произошла ошибка: System.ArgumentException: «Невозможно использовать префикс с пустым пространством имен».

Я не хочу устанавливать URI пространства имен при создании элемента.
Позже я добавлю его с помощью WriteAttributeString(), когда будут созданы другие атрибуты.


person Dominik    schedule 27.11.2017    source источник


Ответы (3)


Нет, префикс пространства имен, не связанный с URI пространства имен, не имеет смысла и не допускается в правильно сформированном пространстве имен XML-документ.

person kjhughes    schedule 27.11.2017

Я не хочу устанавливать URI пространства имен при создании элемента. Позже я добавлю его с помощью WriteAttributeString(), когда будут созданы другие атрибуты.

Префикс всегда принадлежит пространству имен. При определении ненулевого пространства имен атрибут xmlns будет создан автоматически:

writer.WriteStartElement("prefix", "localName", "ns"); // <prefix:localName xmlns:prefix="ns" />
person György Kőszeg    schedule 27.11.2017

У меня была та же проблема, я искал решение, в конце концов я понял, что должен использовать то же пространство имен, которое я уже определил.

У меня было что-то вроде этого, чтобы создать элемент:

xmlWriter.WriteStartElement("xhtml", "link", "xmlns");

результат был:

<?xml version="1.0" encoding="utf-8" ?>
<urlset xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>
        <loc>https://www.my-site.com/en/home</loc>
        <xhtml:link rel="alternative" hreflang="en" href="https://www.my-site.com/en/home" xmlns:xhtml="xmlns" />
        <xhtml:link rel="alternative" hreflang="ar" href="https://www.my-site.com/fr/home" xmlns:xhtml="xmlns" />
        <xhtml:link rel="alternative" hreflang="fa" href="https://www.my-site.com/fa/home" xmlns:xhtml="xmlns" />
    </url>
</urlset>

проблема заключалась в том, что xmlns:xhtml="xmlns" в теле моих xhtml:link элементов:

<xhtml:link rel="alternative" hreflang="en" href="https://www.my-site.com/en/home" xmlns:xhtml="xmlns" />

поэтому я помещаю пространство имен http://www.w3.org/1999/xhtml вместо пространства имен или ns, как показано ниже:

xmlWriter.WriteStartElement("xhtml", "link", "http://www.w3.org/1999/xhtml");

и теперь это стало именно то, что мне нужно:

<?xml version="1.0" encoding="utf-8" ?>
<urlset xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>
        <loc>https://www.my-site.com/en/home</loc>
        <xhtml:link rel="alternative" hreflang="en" href="https://www.my-site.com/en/home" />
        <xhtml:link rel="alternative" hreflang="ar" href="https://www.my-site.com/fr/home" />
        <xhtml:link rel="alternative" hreflang="fa" href="https://www.my-site.com/fa/home" />
    </url>
</urlset>
person mahdi yousefi    schedule 24.06.2020
comment
Хорошо, что вы смогли справиться со своей путаницей в отношении аргументов WriteStartElement, но ваша проблема в другом: проблема OP заключалась в желании создать элемент с неопределенным префиксом пространства имен, что не разрешено в правильно сформированном пространстве имен XML; ваша проблема в том, что вы просто неправильно поняли цель третьего аргумента для WriteStartElement(), но были в порядке с префиксом пространства имен, привязанным к пространству имен, как только вы исправили свою ошибку. - person kjhughes; 04.02.2021