我对建议/伪代码代码/解释感兴趣,而不是实际实现。
我想浏览 xml 文档及其所有节点
检查节点是否存在属性
如果节点没有属性, get/generate String with value of its xpath
如果节点确实具有属性,则遍历属性列表并为包括节点在内的每个属性创建 xpath。
忠告的话?希望你能提供一些有用的情报
编辑:
这样做的原因是..我在jmeter中编写自动化测试,所以对于每个请求我都需要验证请求是否确实完成了它的工作所以我通过使用xpath获取节点值来断言结果。(额外信息 - 无关紧要)
当请求很小时,手动创建断言不是问题,但对于较大的请求,它真的很痛苦..(额外信息 - 无关紧要)
赏金:
我正在寻找 Java 方法
目标
我的目标是从此 ex xml 文件实现以下目标:
<root>
<elemA>one</elemA>
<elemA attribute1='first' attribute2='second'>two</elemA>
<elemB>three</elemB>
<elemA>four</elemA>
<elemC>
<elemB>five</elemB>
</elemC>
</root>
产生以下内容:
//root[1]/elemA[1]='one'
//root[1]/elemA[2]='two'
//root[1]/elemA[2][@attribute1='first']
//root[1]/elemA[2][@attribute2='second']
//root[1]/elemB[1]='three'
//root[1]/elemA[3]='four'
//root[1]/elemC[1]/elemB[1]='five'
解释:
- 如果节点值/文本不为空/零,则获取 xpath ,添加 = ‘nodevalue’ 用于断言目的
- 如果节点有属性也为它们创建断言
赏金更新:
我找到了这个例子,它没有产生正确的结果,但我正在寻找这样的东西:
http://www.coderanch.com/how-to/java/SAXCreateXPath
原文由 ant 发布,翻译遵循 CC BY-SA 4.0 许可协议
更新:
@c0mrade 更新了他的问题。这是一个解决方案:
这个 XSLT 转换:
应用于提供的 XML 文档时:
产生完全想要的、正确的结果:
当应用到@c0mrade 新提供的文档时:
再次产生正确的结果:
解释:
仅匹配和处理没有子元素或具有属性的元素。
对于任何此类元素,如果它没有子元素,则其所有祖先元素或自身元素都以特定模式处理,名为
'path'
。然后"='theValue'"
部分输出,然后是一个 NL 字符。然后处理匹配元素的所有属性。
最后,模板应用于所有子元素。
在
'path'
模式中处理元素很简单:输出一个/
字符和元素的名称。然后,如果前面有同名的兄弟姐妹,则输出“[numPrecSiblings+1]”部分。属性的处理很简单:首先将所有
ancestor-or-self::
其父元素的元素以'path'
模式处理,然后输出 [attrName=attrValue] 部分,后跟一个 NL 字符。请注意:
名称空间中的名称以其初始可读形式毫无问题地显示。
为了提高可读性,永远不会显示索引
[1]
。以下是我的初步回答(可能会被忽略)
这是一个纯 XSLT 1.0 解决方案:
下面是一个示例 xml 文档和一个样式表,它采用节点集参数并为每个成员节点生成一个有效的 XPath 表达式。
样式表(buildPath.xsl):
xml源(buildPath.xml):
结果: