1

だから私はxmlファイルを解析しようとしています:

 <?xml version="1.0" encoding="utf-8" ?>
<Root>    
  <att1 name="bob" age="unspecified" xmlns="http://foo.co.uk/nan">    
  </att1>    
</Root>

次のコードを使用します。

XElement xDoc= XElement.Load(filename);
var query = from c in xDoc.Descendants("att1").Attributes() select c;
foreach (XAttribute a in query)
{
    Console.WriteLine("{0}, {1}",a.Name,a.Value);
}

xmlファイルからxmlns="http://foo.co.uk/nan"を削除しない限り、コンソールには何も書き込まれません。その後、必要に応じて、属性名と値のリストを取得します。 !

編集:フォーマット。

4

3 に答える 3

3

コードで同じ名前空間を使用する必要があります。

XElement xDoc= XElement.Load(filename);
XNamespace ns = "http://foo.co.uk/nan";
var query = from c in xDoc.Descendants(ns + "att1").Attributes() select c;
foreach (XAttribute a in query)
{
    Console.WriteLine("{0}, {1}",a.Name,a.Value);
}

属性はデフォルトの(xmlns=....)名前空間を取得しないため、属性を修飾する必要はありません。名前空間タグ(xmln:tags=....)は、ドキュメントまたはAPIの使用に対して純粋にローカルであり、名前は実際には常に名前空間+ローカル名であるため、常に名前空間を指定する必要があります。

于 2010-03-11T14:31:21.430 に答える
2

Descendantsの呼び出しは、名前空間のない「att1」という名前の要素をクエリしています。

電話Descendants("{http://foo.co.uk/nan}att1")をかけた場合は、名前空間の要素を選択しますが、名前空間のない要素は選択しません。

次のように、任意の名前空間または名前空間なしで「att1」という名前の要素を選択できます。

var query = from c in xDoc.Descendants() where c.Name.LocalName == "att1" select c.Attributes;
于 2010-03-11T14:39:38.443 に答える
1

Descendants次のように、呼び出しで名前空間を指定する必要があります。

XNamespace ns = "http://foo.co.uk/nan";
foreach (XAttribute a in xDoc.Descendants(ns + "att1"))
{
    Console.WriteLine("{0}, {1}",a.Name,a.Value);
}
于 2010-03-11T14:31:38.760 に答える