2009-10-28 4 views
0

나는 Xpath에 익숙하지 않아 문제가있다. 특정 부모 노드 아래 모든 노드를 원합니다! 이 쿼리로 시도했지만 빈 결과 만 얻습니다! :(C# - XPath-Question : 지정된 부모 노드에서 노드를 얻는 방법?

var ISDN_confs = from x in xdoc.XPathSelectedElements("//member[name='participantOne']//member[name='name']") 
       select x; 

샘플 XML :.

<methodResponse> 
<params> 
    <param> 
    <value> 
     <struct> 
     <member> 
      <name>calls</name> 
       <value> 
       <array> 
        <data> 
        <value> 
         <struct> 
         <member> 
          <name>uniqueId</name> 
          <value> 
           <int>6</int> 
          </value> 
         </member> 
    <member> 
    <name>participantOne</name> 
    <value> 
     <struct> 
      <member> 
       <name>uniqueId</name> 
       <value> 
        <int>1609</int> 
       </value> 
      </member> 
      <member> 
       <name>protocol</name> 
       <value> 
        <string>h323</string> 
       </value> 
      </member> 
      <member> 
       <name>incoming</name> 
       <value> 
        <boolean>1</boolean> 
       </value> 
      </member> 
      <member> 
       <name>progress</name> 
       <value> 
        <string>connected</string> 
       </value> 
      </member> 
      <member> 
       <name>fecc</name> 
       <value> 
        <boolean>1</boolean> 
       </value> 
      </member> 
      <member> 
       <name>videoCodec</name> 
       <value> 
        <string>h264</string> 
       </value> 
      </member> 
      <member> 
       <name>audioCodec</name> 
       <value> 
        <string>g722</string> 
       </value> 
      </member> 
      <member> 
       <name>autoAttendant</name> 
       <value> 
        <boolean>0</boolean> 
       </value> 
      </member> 
      <member> 
       <name>name</name> 
       <value> 
        <string>Test Endpoints</string> 
       </value> 
      </member> 
      <member> 
       <name>number</name> 
       <value> 
        <string>12345</string> 
       </value> 
      </member> 
      <member> 
       <name>ipAddress</name> 
       <value> 
        <string>192.168.2.155</string> 
       </value> 
      </member> 
      <member> 
       <name>callIdentifier</name> 
       <value> 
        <base64>CCCCVVVVVDDDDD</base64> 
       </value> 
      </member> 
     </struct> 
    </value> 
</member> 
<member> 
<name>participantTwo</name> 
<value> 
<struct> 
<member> 
<name>name</name> 
<value> 
<string/> 
</value> 
</member> 
<member> 
<name>number</name> 
<value> 
<string>123456</string> 
</value> 
</member> 
<member> 
<name>channels</name> 
<value> 
<array> 
<data> 
<value> 
<int>1</int> 
</value> 
<value> 
<int>2</int> 
</value> 
</data> 
</array> 
</value> 
</member> 
</struct> 
</value> 
</member> 
</struct> 
</value> 

원하는 출력 그래서 내가 모든 이름 - 회원 싶지 않는,하지만 실제 출력의 제한된 변화해야 두의 이름 - 회원 채널 멤버가없는 구조 I 희망

는 분명 내가 원하는 :

샘플 출력 :.!

<member> 
    <name>name</name> 
    <value> 
     <string>Test Endpoints</string> 
    </value> 
</member> 

위의 쿼리에서 나는 아래의 주석에서 말했듯이, 모든 이름 멤버를 얻었지만 원하는 것은 그렇지 않습니다!

UPDATE --- 는 난 단지 비어있는 결과를 얻을이 쿼리

var parts = from c in xdoc.XPathSelectElements("//member[name='name']") 
        where c.Element("name").Value == "channels" && c.Element("name").HasElements 
        select c; 

만에 채널-회원이 모든 이름 구성원을 얻기 위해 노력!

+1

XML 스 니펫이 유효하지 않은 것 같습니다. 첫 번째 값과 구조체 노드는 어디에 닫 혔는가? 그리고 최상위 구성원 노드도 닫히지 않았습니까? 귀하의 구조를 명확하게 만드는 스 니펫을 삽입 할 수 있습니까? 텍스트로 삽입하여 복사하여 붙여 넣을 수 있습니다. –

+0

그냥 다른 시간을 편집, 지금 내가 원하는 것을 분명히 희망 :) – cordellcp3

답변

1
샘플 문서와 당신이 실제로 원하는 것을보고 조금 어렵 원하는 출력을 보지 않고

하지만, 일반적으로 당신은 또한 부모 포함하는 단일 XPath 식을 사용합니다 :

"//member[name='participantOne']/member[name='name']" 

이 만약을 원하시는 것을하지 않으므로 샘플 입력 및 출력을 포함하도록 질문을 편집 할 수 있습니다.

사실 마지막 문장은 조금 혼란 스럽습니다. 부모 노드의 이름이 participantOne입니까? 자식 노드의 이름은 name입니까? 그럼 당신은 간단하게 작성할 수 있습니다 회원 [이름 = 'participantOne']으로

"//participantOne/name" 

업데이트

노드가 직접 부모없는 있지만 acestor은 사용 할 것

//member[name='participantOne']//member[name='name'] 

을 XPath 표현식으로 사용하십시오.

+0

안녕하세요 divo, 그냥 내 질문을 편집했습니다! – cordellcp3

+0

고마워요! // member [name = 'participantOne'] // member [name = 'name'] 잘되었습니다! – cordellcp3

+0

xpath 표현식을 변경하여 결과를 제한 할 수 있습니다. 즉, participantOne 구조의 이름 멤버와 partipantTwo 구조의 이름 멤버를 원하십니까? – cordellcp3

관련 문제