【问题标题】:C# - XPath-Question: How to get Nodes under a specified parent-node?C# - XPath-问题:如何获取指定父节点下的节点?
【发布时间】:2009-10-28 10:24:47
【问题描述】:

我是 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>

目前,通过上述查询,我​​得到了所有名称成员,但这不是我想要的,就像我在下面的 cmets 中所说的那样!

更新--- 我试图通过此查询获取所有具有频道成员的名称成员

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

但只能得到一个空的结果!

【问题讨论】:

  • XML sn-p 似乎无效。第一个值和结构节点在哪里关闭?而且顶级成员节点也没有关闭?您能否插入一个使您的结构清晰的 sn-p(因为这似乎是一个问题)。最好作为文本插入,这样我们就可以复制粘贴了。
  • 刚刚编辑了一次,希望现在清楚我想要什么:)

标签: c# linq xpath


【解决方案1】:

在没有看到示例文档和所需输出的情况下,很难看到您真正想要的内容,但通常您只需使用一个 XPath 表达式,其中还包括父项:

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

如果这不符合您的要求,您可以编辑您的问题以包含示例输入和输出。

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

"//participantOne/name"

更新

由于 member[name='participantOne'] 节点不是直接父节点,而是您必须使用的 acestor

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

作为您的 XPath 表达式。

【讨论】:

  • 谢谢迪沃! //member[name='participantOne']//member[name='name'] 效果很好!
  • 是否可以更改 xpath 表达式以限制结果,以便可以说:我想要参与者一个结构中的名称成员和 partipantTwo 结构中的名称成员?
  • 对不起,你能把它说得更清楚一点吗,也许有一个所需输出的例子?
  • 我有一个带有调用节点的巨大 xml 文件。每个调用节点都有结构“participantOne”和“participantTwo”!我想要在两个“参与者”结构之一中没有通道成员的名称成员。没有通道成员的名称成员可能在多个调用节点中。我用一个示例 xml 编辑上面的问题!
  • 抱歉,什么是频道会员?您能否向我展示您的查询应选择的示例输出(以 XML 格式)。顺便说一句,您的 XML 示例无效。
猜你喜欢
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多