Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XPath语法-如何在复杂位置路径中使用position()_Xml_Xpath_Position - Fatal编程技术网

Xml XPath语法-如何在复杂位置路径中使用position()

Xml XPath语法-如何在复杂位置路径中使用position(),xml,xpath,position,Xml,Xpath,Position,我正在编写一个递归算法,为给定元素生成唯一的最小XPath。 其主要思想是允许在一个文档中选择一个元素(即PC上chrome中的html元素),并能够在类似文档中找到相应的元素(即移动版本中的同一站点) 在这个过程中,我需要为整个给定文档生成一个完整的XPath字符串,即对于给定节点,遍历整个树并将所有节点及其所有属性附加到字符串中 例如,对于以下文档(所需元素标记为“*”): 收益率 非常适合这个元素 我的问题是,在一种特殊情况下(即,当包含所需元素的子树具有相同的“兄弟”时),我必须使用元素

我正在编写一个递归算法,为给定元素生成唯一的最小XPath。 其主要思想是允许在一个文档中选择一个元素(即PC上chrome中的html元素),并能够在类似文档中找到相应的元素(即移动版本中的同一站点)

在这个过程中,我需要为整个给定文档生成一个完整的XPath字符串,即对于给定节点,遍历整个树并将所有节点及其所有属性附加到字符串中

例如,对于以下文档(所需元素标记为“*”):

收益率
非常适合这个元素

我的问题是,在一种特殊情况下(即,当包含所需元素的子树具有相同的“兄弟”时),我必须使用元素的
position()=SOME_NUMBER
(或“index”节点
[SOME_NUMBER]
)来唯一地标识元素,而我在语法上遇到了问题

例如,对于更复杂的文档(同样,元素标记为“*”。索引属性不是原始文档的一部分,只是为了参考而添加):


*
*
当然,前面的XPath可以找到四个元素:

<node id="go_button" text="Go" index="a1"></node>
<node id="go_button" text="Go" index="a2"></node>
<node id="go_button" text="Go" index="b1"></node>
<node id="go_button" text="Go" index="b2"></node>


我尝试在XPath中的不同位置添加位置节点(例如
/*[@id='go\u button'和@text='go'和position=2,父节点:*[child:*[@id='url\u text\u field']和child:*[@id='back\u button'和@text='back']和父节点:*[child:*[@id='webViewPlaceholder']和父节点:*[@id='content']]1]]]
不起作用),但无法找到只匹配第一个“父”子树下的第二个“兄弟”子树的方法。

只需将
[position()=1]
附加到路径表达式中,即可返回xml中与路径匹配的两个节点(索引a1和b1)。如果只需要第一个,那么不要使用
/
,而是使用
/genderant::
<代码>/通常会产生意想不到的后果。

对于parent::axis,这是不可能的,因为它总是只返回一个元素:parent。因此,在[1]之外添加位置谓词将永远不会返回元素

你可以用它来胡乱寻找解决方案,但你找不到任何解决方案


您必须创建不同的策略来创建返回唯一元素的有效xpath。

解决方案是使用索引节点,而不是调用
位置

我用圆括号包装整个xpath表达式,并添加索引:

(xpath_expression)[index]

感谢
/substant::
提示,它确实有效,我可以按索引过滤整个XPath的结果。但我仍在试图找出如何在父级进行过滤(即,为了只获取a1和a2,将
[position()=1]
节点放置在何处)。我需要放置多个索引,在多个子树相同的树中,每层一个索引。那么<代码>/Degenant::*[@id='content'][position()=1]/Degenant::*[@id='go\u button'和@text='go']
如果您只需要a1,请再次追加
[position()=1]
-就像<代码>/Degenant::*[@id='content'][position()=1]/Degenant::*[@id='go\u button'和@text='go'][position()=1]
是否可以调用返回索引的函数?例如,(xpath_表达式)[ROW()]
<?xml version="1.0" encoding="UTF-16"?>
<node>
    <node/>
    <node id="content" index="a">
        <node>
            <node>
                <node id="url_text_field"/>
                <node id="go_button" text="Go" index="a1">
                </node>
                *<node id="go_button" text="Go" index="a2">
                </node>*
                <node id="back_button" text="Back">
                </node>
            </node>
            <node id="webViewPlaceholder">
                <node/>
            </node>
        </node>
    </node>
    <node id="content" index="b">
        <node>
            <node>
                <node id="url_text_field"/>
                <node id="go_button" text="Go" index="b1">
                </node>
                <node id="go_button" text="Go" index="b2">
                </node>
                <node id="back_button" text="Back">
                </node>
            </node>
            <node id="webViewPlaceholder">
                <node/>
            </node>
        </node>
    </node>
</node>
<node id="go_button" text="Go" index="a1"></node>
<node id="go_button" text="Go" index="a2"></node>
<node id="go_button" text="Go" index="b1"></node>
<node id="go_button" text="Go" index="b2"></node>
(xpath_expression)[index]