XDocument 내부의 깊은 요소 값을 반환합니다
-
05-07-2019 - |
문제
나는 다음 XML을 가지고 있으며 후손 (). 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>
이제 이번에는 마지막 이름 이이 네임 스페이스에서 제외됩니다 (무언가)
그러나 당신이 어렵다면 접두사를 사용하여 번거 로움으로 똑같은 일을 할 수 있습니다.
<pre:Persons xlmns:pre="something">
<pre:Person>
<pre:Name>John</Name>
</Person>
</Person>
그러나 모든 자손을이 이름 공간에 포함시키려면 위의 예를 보여 주듯이 모든 후손 내에서 접두사를 사용해야합니다.
일부 요소를 제외하려면 다음과 같습니다.
<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