문제

나는 다음 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");
 }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top