2017-10-23 5 views
0

요소를 선택하려고하는 XML 문자열이 있는데 XDocument.Decendents() 메서드에 대해 혼란스러워합니다. 다음은 샘플 XML입니다.XDocument.Descendants() 필터가 너무 많습니다.

<response> 
    <control> 
    <status>success</status> 
    <dtdversion>3.0</dtdversion> 
    </control> 
    <operation> 
    <authentication> 
     <status>success</status> 
     <userid>jsmith</userid> 
     <companyid>1621876182</companyid> 
     <sessiontimestamp>2017-10-23T11:57:27-07:00</sessiontimestamp> 
    </authentication> 
    <result> 
     <status>success</status> 
     <function>GetFields</function> 
     <controlid>723973</controlid> 
     <data listtype="All" count="1"> 
     <type fieldname="ID">User Id</type> 
     <type fieldname="FIRSTNAME">User First Name</type> 
     <type fieldname="LASTNAME">User Last Name</type> 
     <type fieldname="MIDDLEINITIAL">User Middle Initial</type> 
     <type fieldname="ADDRESS1">User Address 1</type> 
     <type fieldname="ADDRESS2">User Address 1</type> 
     <type fieldname="CITY">City of User Residence</type> 
     <type fieldname="STATE">State of User Residence</type> 
     <type fieldname="PHONENUMBER">User Phone Number</type> 
     <type fieldname="EMAIL">User Email Address</type> 
     </data> 
    </result> 
    </operation> 
</response> 

내 목표는 data 노드 내의 노드 값 목록을 얻는 것입니다. 나는 다음과 같은 작품을 발견하고 10 요소의 목록을 반환합니다. 나를 혼란 무엇

List<string> nodeList = xml.Descendants().Attributes("fieldname").Select(x => x.Value).ToList<string>(); 

내가 자식 노드 아래에 보일 것입니다 유일한 노드로 data 노드를 지정하려한다는 것입니다. 방금 "데이터"Descendants() 메서드에 대한 XName 매개 변수로 추가했습니다.

List<string> nodeList = xml.Descendants("data").Attributes("fieldname").Select(x => x.Value).ToList<string>(); 

이 경우의 결과는 0의 수를 반환 nodeList. 나는 XML 문서에서 "fieldname"이라는 속성 이름을 가진 다른 노드가 <data> 노드의 자식 요소가 아닌 다른 노드를 선택하지 않도록 노드를 선택해야한다는 것을보다 구체적으로 설명하고자했습니다. 나는 왜 내가 제로 결과를 얻었는지 확신 할 수 없었고 누군가가 이것에 관해 어떤 생각을 밝힐 수 있기를 희망했다.

+0

몇 개의 항목을 예상합니까? – Nikolaus

+0

나는 10 개의 노드가 돌아올 것을 기대하고있다. – webworm

답변

1

자손은 데이터 유형 인 자손을 필터링하지만 속성이있는 데이터 자손은 없다고 생각합니다. 시험해보기 :

List<string> nodeList = xml.Descendants("data").Descendants().Attributes("fieldname").Select(x => x.Value).ToList<string>(); 
+0

그랬다! 설명 해줘서 고마워. 따라서'Descendants ("data")'는'data '값을 가진 루트 노드의 자손을 선택해야합니다. 자식 노드를 선택하려면 두 번째'Descendants()'가 필요합니다. – webworm