Пустое пространство имен с использованием Linq Xml - PullRequest
32 голосов
/ 14 сентября 2008

Я пытаюсь создать карту сайта, используя Linq to 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 (), но есть ли более правильный путь?

Ответы [ 3 ]

43 голосов
/ 14 сентября 2008

«Более правильный путь» будет:

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 +" перед каждым именем элемента, которое должно быть в пространстве имен карты сайта. Он достаточно умен, чтобы не помещать ненужные объявления пространства имен в результирующий 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>

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

4 голосов
/ 22 апреля 2009

Я наткнулся на этот пост, имея дело с аналогичной проблемой в 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 чертовски крут.

2 голосов
/ 14 сентября 2008

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

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

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