33

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>

url 要素に xmlns="" を付けたくないのです。最終的な xdoc.ToString() で Replace を使用して削除できますが、もっと正しい方法はありますか?

4

3 に答える 3

44

「より正しい方法」は次のようになります。

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>

私が間違っていなければ、それはあなたが望むものです。

于 2008-09-14T05:00:22.063 に答える
4

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")

これが誰かに役立つことを願っています。このような道路での衝突にもかかわらず、XLinqAPIはかなりクールです。

于 2009-04-22T13:54:52.283 に答える
2

1 つの要素が名前空間を使用する場合、すべての要素で 1 つを使用する必要があります。独自に定義しない場合、お気づきのように、フレームワークは空の名前空間を追加します。そして、悲しいことに、この「機能」を抑制するためのスイッチや類似のものはありません。

そのため、それを取り除く方法としてこれ以上の方法はないようです。Replace(" xmlns=\"\"", "")を使用すると、正規表現を実行するよりも少し速くなる可能性があります。

于 2008-09-14T03:40:46.623 に答える