5

linq-to-xml を使用して要素を検索しています。

 var doc = XDocument.Load(reader);
                    var ns = doc.Root.Attribute("xmlns").Value;
                    var result = (from u in doc.Descendants(XName.Get("MyElement", ns))

xml で要素を検索しようとするたびに、XName.Get を使用する必要がなくなります。検索時に邪魔にならないように、デフォルトの名前空間を XDocument に設定するにはどうすればよいですか。

よろしく。

4

6 に答える 6

7

本当にやりたい場合は、デフォルトの名前空間を無視する 1 つの方法を次に示します。

        XDocument doc;
        using (XmlTextReader xr = new XmlTextReader("input.xml"))
        {
            xr.Namespaces = false;
            doc = XDocument.Load(xr);
        }
        foreach (XElement bar in doc.Descendants("bar"))

しかし、XML における名前空間の存在と重要性を受け入れ、LINQ to XML が提供する XName オブジェクトと XNamespace オブジェクトを使用してそれらを操作することをお勧めします。

于 2012-04-24T13:24:41.897 に答える
4

xml で要素を検索しようとするたびに、XName.Get を使用する必要がなくなりました。検索時に邪魔にならないように、デフォルトの名前空間を XDocument に設定するにはどうすればよいですか。

できませんが、他に 2 つのオプションがあります。

  • +(XNamespace, string)次の演算子を使用します。

    doc.Descendants(ns + "MyElement")
    
  • 値を一度作成してXNameから、クエリでそれらを参照するだけです。

    XName myElementName = ns + "MyElement";
    ...
    doc.Descendants(myElementName);
    

とにかく名前空間を動的に作成しないのが理想的です。探している名前空間がわからないのですか? その場合、適切なXName値を持つプライベート静的読み取り専用フィールドを作成できます。

于 2012-04-24T13:06:11.457 に答える
1

LocalName を使用することもできます。これは LINQ を醜くしますが、仕事は完了します。(この場合は、MSBuild プロジェクト ファイルから属性を取得します)。

var imports = from i in doc.Root.Elements()
              where i.Name.LocalName == "Import"
              from p in i.Attributes()
              where p.Name.LocalName == "Project"
              select p.Value;

この方法で私が気に入っているのは、XML を元の形式のままにしながら、何か面白いことが起こっていることを他の人に示唆することです。LINQ 式に「LocalName」を入れることは、一種の自己文書化ハックです。

コードが分離された場合、XmlTextReader で名前空間を無効にすることは簡単に見落とされます。

于 2015-10-26T19:37:45.660 に答える
1

できませんか:

doc = XDocument.Load(reader);
var ns = doc.Root.Attribute("xmlns").Value;
var result = from u in doc.Descendants.Elements(ns+"MyElement").Select(c=>c.Value);
于 2012-04-24T13:02:14.267 に答える
0

これは古い投稿ですが、ここに私の考えがあります:

Elements.xml ルート要素には名前空間属性が含まれています。次のコードは名前空間を無視します。

XDocument doc = XDocument.Load("Elements.xml");

            if (doc.Root != null)
                foreach (XElement xElement in doc.Root.Elements())
                {
                    Console.WriteLine(xElement);
                }
于 2021-05-08T11:21:24.557 に答える