Подтвердить что ты не робот

Пустое пространство имен с использованием Linq Xml

Я пытаюсь создать карту сайта с помощью Linq для Xml, но получаю пустой атрибут пространства имен, от которого я бы хотел избавиться. например.

XNamespace ns = "http://www.sitemaps.org/schemas/sitemap/0.9";

XDocument xdoc = new XDocument(new XDeclaration("1.0", "utf-8", "true"),
    new XElement(ns + "urlset",

    new XElement("url",
        new XElement("loc", "http://www.example.com/page"),
        new XElement("lastmod", "2008-09-14"))));

Результат...

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url xmlns="">
    <loc>http://www.example.com/page</loc>
    <lastmod>2008-09-14</lastmod>
  </url>
</urlset>

Я бы предпочел не иметь xmlns = "" в элементе url. Я могу разбить его, используя Replace на конечной xdoc.ToString(), но есть ли более правильный способ?

4b9b3361

Ответ 1

"Более правильным способом" будет:

XDocument xdoc = new XDocument(new XDeclaration("1.0", "utf-8", "true"),
new XElement(ns + "urlset",
new XElement(ns + "url",
    new XElement(ns + "loc", "http://www.example.com/page"),
    new XElement(ns + "lastmod", "2008-09-14"))));

То же, что и ваш код, но с "ns +" перед каждым именем элемента, которое должно быть в пространстве имен sitemap. Он достаточно умен, чтобы не помещать ненужные объявления пространства имен в результирующий XML, поэтому результат:

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>http://www.example.com/page</loc>
    <lastmod>2008-09-14</lastmod>
  </url>
</urlset>

который, если я не ошибаюсь, что вы хотите.

Ответ 2

Я наткнулся на этот пост, имея дело с аналогичной проблемой в VB.NET. Я использовал XML-литералы, и мне потребовалось некоторое время, чтобы выяснить, как заставить это решение работать с строкой XML-литерала, а не только с функциональной конструкцией.

Решение состоит в том, чтобы импортировать пространство имен XML в верхней части файла.

Imports <xmlns:ns="x-schema:tsSchema.xml">

И затем префикс всех моих XML-литералов в выражении запроса с импортированным пространством имен. Это удаляет пустое пространство имен, появляющееся на элементах, когда я сохранил свой вывод.

Dim output As XDocument = <?xml version="1.0" encoding="utf-8"?>
                              <XML ID="Microsoft Search Thesaurus">
                                  <thesaurus xmlns="x-schema:tsSchema.xml">
                                      <diacritics_sensitive>0</diacritics_sensitive>
                                      <%= From tg In termGroups _
                                          Select <ns:expansion>
                                                     <%= From t In tg _
                                                         Select <ns:sub><%= t %></ns:sub> %>
                                                 </ns:expansion> %>
                                  </thesaurus>
                              </XML>

    output.Save("C:\thesaurus.xml")

Надеюсь, это поможет кому-то. Несмотря на удары на дороге, подобные этому, API XLinq довольно хорош.

Ответ 3

Если один элемент использует пространство имен, все они должны использовать его. В случае, если вы не определите его самостоятельно, инфраструктура добавит пустое пространство имен, как вы заметили. И, к сожалению, нет переключателя или чего-то подобного для подавления этой "функции".

Итак, кажется, нет лучшего метода, чтобы раздеть его. Использование Replace ( "xmlns = \" \ "," ") может быть немного быстрее, чем выполнение RegEx.