xmlnsを使用したXMLファイルを解析するときに、なぜのXElementが倒れていますか?
-
19-09-2019 - |
質問
私は、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);
}
私はのxmlnsを削除しない限り何もコンソールに書き込まれません=「http://foo.co.uk/nan」xmlファイルから、予想されるように、私は、属性名と値のリストを取得した後、および私が必要として!
編集:書式設定
解決
あなたは、あなたのコード内で同じ名前空間を使用する必要があります:
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の使用に純粋にローカルである、名前は本当に名前空間+常にあなたが常に名前空間を指定する必要がありますので、ローカル名です。
他のヒント
あなたはこのように、Descendants
呼び出しで名前空間を指定する必要があります:
XNamespace ns = "http://foo.co.uk/nan";
foreach (XAttribute a in xDoc.Descendants(ns + "att1"))
{
Console.WriteLine("{0}, {1}",a.Name,a.Value);
}
所属していません StackOverflow