2009-10-28 47 views
0

我是Xpath新手,遇到问题。我想要一个特定的父节点下的所有节点! 我试过这个查询,但只得到一个空的结果! :(C# - XPath问题:如何获取指定的父节点下的节点?

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> 

所需的输出应该是实际产量的有限变化,所以我不希望所有的名成员,但该名成员在两结构没有渠道成员

我希望它清楚我想要什么:)

样本输出!

<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片段似乎无效。第一个值和结构节点在哪里关闭?顶级成员节点也没有关闭?你能否插入一个让你的结构清晰的片段(因为这似乎是一个问题)。最好插入为文本,所以我们可以复制和粘贴。 – 2009-10-28 11:30:35

+0

刚刚编辑了另一次,希望现在它清楚我想要什么:) – cordellcp3 2009-10-28 13:10:18

回答

1

没有看到样本文档和所需输出实在是有点困难见你真正想要的,但通常你会只使用一个XPath表达式这其中也包括父:

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

如果这不做你想要的东西,你可以编辑你的问题,包括样本输入和输出。

其实你最后一句话有点混乱:父节点的名字是participantOne?子节点的名字是name?然后,你可以简单地写:

"//participantOne/name" 

更新

由于成员[名称= 'participantOne']节点不是直接父而是acestor你将不得不使用

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

作为您的XPath表达式。

+0

嗨divo, 刚编辑我的问题! – cordellcp3 2009-10-28 11:02:16

+0

感谢divo! // member [name ='participantOne'] // member [name ='name'] work work fine! – cordellcp3 2009-10-29 07:02:33

+0

是否有可能通过调用xpath-expression来限制结果,以便可以这样说:我想要在ParticipantTwo结构中的participantOne结构中的名称成员和名称成员? – cordellcp3 2009-10-29 09:25:35