1. ホーム
  2. .net

[解決済み] LINQ to XMLで名前空間を無視する

2023-03-16 23:13:37

質問

LINQ to XML にすべての名前空間を無視させるにはどうしたらよいですか?あるいは、どのように名前空間を取り除くのでしょうか?

名前空間が半不規則な方法で設定され、名前空間を持つノードと持たないノードの両方を検索しなければならないことにうんざりしているので、私は質問しているのです。

どのように解決するのですか?

書くのではなく

nodes.Elements("Foo")

を書きます。

nodes.Elements().Where(e => e.Name.LocalName == "Foo")

で、飽きたら自分で拡張メソッドを作ればいい。

public static IEnumerable<XElement> ElementsAnyNS<T>(this IEnumerable<T> source, string localName)
    where T : XContainer
{
    return source.Elements().Where(e => e.Name.LocalName == localName);
}

名前空間付き属性を頻繁に扱う必要がある場合(これは比較的まれです)、属性についても同様です。

[EDIT] XPathの解決策を追加しました。

XPathの場合、書く代わりに

/foo/bar | /foo/ns:bar | /ns:foo/bar | /ns:foo/ns:bar

を使うことができます。 local-name() という関数があります。

/*[local-name() = 'foo']/*[local-name() = 'bar']