XDocumentの奥深くにある要素の値を返す
-
05-07-2019 - |
質問
次のXMLがあり、Descendents()。Descendents()。Descendentsで要素値を取得しようとしましたが、機能しません。
PersonIDの最初の要素で見つかった最初の値を返します。
これは文字列なので、これを実行しています:
XDocument XDoc = XDocument.Parse(XmlString);
<Root>
<Code>200001</Code>
<MsgType>106</MsgType>
<PersonData>
<MSG>
<NewDataSet xmlns="PersonInstances">
<PersonInstances>
<PersonInstanceId>1</PersonInstanceId>
<PersonId>400</PersonId>
<Status>210005</Status>
<DateChanged>2009-10-20T11:53:00+01:00</DateChanged>
</PersonInstances>
<PersonInstances>
<PersonInstanceId>2</PersonInstanceId>
<PersonId>400</PersonId>
<Status>210005</Status>
<DateChanged>2009-10-20T12:13:00+01:00</DateChanged>
</PersonInstances>
<PersonInstances>
<PersonInstanceId>3</PersonInstanceId>
<PersonId>400</PersonId>
<Status>210005</Status>
<DateChanged>2009-10-20T15:28:00+01:00</DateChanged>
</PersonInstances>
<PersonInstances>
<PersonInstanceId>4</PersonInstanceId>
<PersonId>400</PersonId>
<Status>210005</Status>
<DateChanged>2009-10-20T15:32:00+01:00</DateChanged>
</PersonInstances>
<PersonInstances>
<PersonInstanceId>5</PersonInstanceId>
<PersonId>400</PersonId>
<Status>210005</Status>
<DateChanged>2009-10-21T10:49:00+01:00</DateChanged>
</PersonInstances>
<PersonInstances>
<PersonInstanceId>6</PersonInstanceId>
<PersonId>400</PersonId>
<Status>210005</Status>
<DateChanged>2009-10-21T17:15:00+01:00</DateChanged>
</PersonInstances>
<PersonInstances>
<PersonInstanceId>7</PersonInstanceId>
<PersonId>400</PersonId>
<Status>210005</Status>
<DateChanged>2009-10-22T10:06:00+01:00</DateChanged>
</PersonInstances>
<PersonInstances>
<PersonInstanceId>8</PersonInstanceId>
<PersonId>400</PersonId>
<Status>210005</Status>
<DateChanged>2009-10-22T16:01:00+01:00</DateChanged>
</PersonInstances>
</NewDataSet></MSG></PersonData></Root>
解決
実際に間違っているのは、フェッチコードにネームスペースを含めていないことです:
var el = (element.Descendants(XNamespace.Get("PersonInstances") +
"PersonId").FirstOrDefault()).Value;
それを使用すれば、動作します。
しかし、名前空間に関する簡単な情報を提供しましょう:
<Persons xlmns="something">
<Person>
<Name>John</Name>
</Person>
</Person>
この例では、名前空間はすべての子孫に適用されますが、子孫の一部を除外する場合
<Persons xlmns="something">
<Person>
<Name>John</Name>
<LastName xmlns="">Usher</LastName>
</Person>
</Person>
今度は、LastNameはこの名前空間(何か)から除外されます
しかし、あなたにとって難しい場合は、プレフィックスを使用して同じことを簡単に行うことができます:
<pre:Persons xlmns:pre="something">
<pre:Person>
<pre:Name>John</Name>
</Person>
</Person>
ただし、すべての子孫をこの名前空間に含める場合は、上の例に示すように、すべての子孫内でprefixを使用する必要があります
いくつかの要素を除外したい場合:
<pre:Persons xlmns:pre="something">
<Person>
<pre:Name>John</Name>
</Person>
</Person>
その後、単にプレフィックスを削除します、それだけです。
属性についても同じことができます:
<pre:Persons xlmns:pre="something">
<pre:Person>
<pre:Name pre:Value="Yahoo">John</pre:Name>
</Person>
</Person>
そしてもしそうなら、名前空間を持っているものを取得したいときはいつでもコード内で名前空間を示す必要があります。
他のヒント
XDocument XDoc = XDocument.Parse(xfile);
XNamespace ns = "PersonInstances";
if (XDoc.Root.Descendants(ns + "PersonId").Any())
{
Console.Write(XDoc.Root.Descendants(ns + "PersonId").First().Value);
}
else
{
Console.Write("Fail");
}
所属していません StackOverflow