使用XPath可以排除属性?

时间:2016-12-27 09:37:07

标签: json xpath

我有这些数据,我希望能够在每个节点中仅显示名称和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不完全兼容。欢迎任何建议!

/帕特里克

1 个答案:

答案 0 :(得分:0)

使用XPath是不可能的。我had experimented过去看看d​​efiantjs是如何工作的,基本上,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数据模型中,一个元素被认为是一个单元,从开始标记一直到相应的结束标记。在这里,您希望返回仅包含itemname元素的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>