我有这些数据,我希望能够在每个节点中仅显示名称和IP:
{
"virtualservers": [
{
"name": "/partition/name",
"ip": "1.1.1.1",
"port": "80",
"defaultpool": "",
"sslprofile": "None",
"compressionprofile": "/Common/cmpprof",
"persistence": "None",
"irules": [
"/Common/http-to-https"
],
"pools": null,
"sourcexlatetype": "None",
"sourcexlatepool": "None",
"loadbalancer": "MYLB"
},
{
"name": "/partition/name2",
"ip": "2.2.2.2",
"port": "80",
"defaultpool": "",
"sslprofile": "None",
"compressionprofile": "/Common/cmpprof",
"persistence": "None",
"irules": [
"/Common/anotherrule"
],
"pools": null,
"sourcexlatetype": "None",
"sourcexlatepool": "None",
"loadbalancer": "MYLB2"
}
]
}
我捅了一下,这几乎有效:
//virtualserver[(position() > 0 and position() < 10)]/*[name()="name" or name()="ip"]
[
"/partition/name",
"1.1.1.1",
"/partition/name2",
"2.2.2.2"
]
但是我想保留节点信息,我可以在我的模板中正确地执行它。理想情况下,结果将是这样的
[
{
"name": "/partition/name",
"ip": "1.1.1.1",
},
{
"name": "/partition/name2",
"ip": "2.2.2.2",
}
]
我正在使用defiantjs,因此它可能与XPath不完全兼容。欢迎任何建议!
/帕特里克
答案 0 :(得分:0)
使用XPath是不可能的。我had experimented过去看看defiantjs是如何工作的,基本上,virtualservers
数组中的每个项目都转换为单个XML元素,大致如下所示:
<d:item xmlns:d="defiant-namespace" d:mi="34">
<name d:constr="String" d:mi="21">/partition/name</name>
<ip d:constr="String" d:mi="22">1.1.1.1</ip>
<port d:constr="String" d:mi="23">80</port>
<defaultpool d:constr="String" d:mi="24"></defaultpool>
<sslprofile d:constr="String" d:mi="25">None</sslprofile>
<compressionprofile d:constr="String" d:mi="26">/Common/cmpprof</compressionprofile>
.....
</d:item>
现在在XPath数据模型中,一个元素被认为是一个单元,从开始标记一直到相应的结束标记。在这里,您希望返回仅包含item
和name
元素的ip
元素,如下所示,但是,源XML中没有这样的元素,XPath可以回复:
<d:item xmlns:d="defiant-namespace" d:mi="34">
<name d:constr="String" d:mi="21">/partition/name</name>
<ip d:constr="String" d:mi="22">1.1.1.1</ip>
</d:item>