【问题标题】:How can I get all the values of from a nested xml?如何从嵌套的 xml 中获取所有值?
【发布时间】:2018-05-16 07:52:28
【问题描述】:

我得到的响应类似于我在合同中获得多个合同的地方。响应中可能有 4 个或 3 个或 5 个合同。我想获取每个合同中所有 ContractStartDate 的值。

<Contracts xmlns="http://www.ggmd.nl/data/service/kpicontract">
   <Contract>
      <ContractStartDate>2015-01-01+01:00</ContractStartDate>
      <ContractEndDate>2015-01-10+01:00</ContractEndDate>
      <ContractSubject>02 - 0H304</ContractSubject>
   </Contract>
  <Contract>
      <ContractStartDate>2017-01-01+01:00</ContractStartDate>
      <ContractEndDate>2017-01-10+01:00</ContractEndDate>
      <ContractSubject>02 - 0H304</ContractSubject>
   </Contract>
 <Contract>
      <ContractStartDate>2017-01-01+01:00</ContractStartDate>
      <ContractEndDate>2017-01-10+01:00</ContractEndDate>
      <ContractSubject>02 - 0H304</ContractSubject>
   </Contract>
</Contracts>

编辑 我想像下面这样:

<Dates>
<ContractStartDate>2015-01-01+01:00</ContractStartDate>
<ContractStartDate>2017-01-01+01:00</ContractStartDate>
<ContractStartDate>2017-01-01+01:00</ContractStartDate>
</Dates

如何通过使用 xpath 或 xslt 或脚本任何可能的解决方案来获取 wso2 esb 中每个 ContractStartDate 的所有值?

【问题讨论】:

  • 你需要的输出格式是什么?
  • 我需要像 2015-01-01+01:002017-01-01+01:00 这样的 xml 2017-01-01+01:00

标签: xml xslt wso2 wso2esb xpath-2.0


【解决方案1】:

由于您没有指定预期的输出,我将为您提供 XPATH 解决方案,以从您的文件中获取 &lt;ContractStartDate&gt; 节点:

输入:

more contracts.xml
<Contracts xmlns="http://www.ggmd.nl/data/service/kpicontract">
   <Contract>
      <ContractStartDate>2015-01-01+01:00</ContractStartDate>
      <ContractEndDate>2015-01-10+01:00</ContractEndDate>
      <ContractSubject>02 - 0H304</ContractSubject>
   </Contract>
  <Contract>
      <ContractStartDate>2017-01-01+01:00</ContractStartDate>
      <ContractEndDate>2017-01-10+01:00</ContractEndDate>
      <ContractSubject>02 - 0H304</ContractSubject>
   </Contract>
 <Contract>
      <ContractStartDate>2017-01-01+01:00</ContractStartDate>
      <ContractEndDate>2017-01-10+01:00</ContractEndDate>
      <ContractSubject>02 - 0H304</ContractSubject>
   </Contract>
</Contracts>

XPATH1: -> 访问 XML DOM 树中的所有 ContractStartDate 节点

/*[local-name()='Contracts']/*[local-name()='Contract']/*[local-name()='ContractStartDate']

输出 1:

<ContractStartDate>2015-01-01+01:00</ContractStartDate><ContractStartDate>2017-01-01+01:00</ContractStartDate><ContractStartDate>2017-01-01+01:00</ContractStartDate>

XPATH2: -> 访问 XML DOM 树中的所有 ContractStartDate 节点文本字段

/*[local-name()='Contracts']/*[local-name()='Contract']/*[local-name()='ContractStartDate']/text()

输出2:

2015-01-01+01:002017-01-01+01:002017-01-01+01:00

如果您需要根据需要格式化输出,您可以在 XSLT 样式表中使用这个特定的 XPATH

如果您想达到您定义的输出,那么您需要使用以下XSLT

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:redirect="http://xml.apache.org/xalan/redirect" extension-element-prefixes="redirect" xmlns:xalan="http://xml.apache.org/xslt" exclude-result-prefixes="xalan">
<xsl:output method="xml" indent="yes" xalan:indent-amount="4"/>
<xsl:strip-space elements="*" />

<xsl:template match="/">
        <dates>
        <xsl:for-each select="/*[local-name()='Contracts']/*[local-name()='Contract']/*[local-name()='ContractStartDate']">
                <ContractStartDate>
                        <xsl:value-of select="." />
                </ContractStartDate>
        </xsl:for-each>
        </dates>
</xsl:template>

</xsl:stylesheet>

根据您的输入,它会产生:

$xsltproc contracts.xslt contracts.xml
<?xml version="1.0"?>
<dates>
  <ContractStartDate>2015-01-01+01:00</ContractStartDate>
  <ContractStartDate>2017-01-01+01:00</ContractStartDate>
  <ContractStartDate>2017-01-01+01:00</ContractStartDate>
</dates>

【讨论】:

  • 我们为什么不建议简单的XPATH://Contracts/Contract/ContractStartDate
  • @Amrendra Kumar 这只会返回第一个 ContractEndDate 而不是全部
  • @Allan 我的合同 xml 也可以返回多个合同,它并不总是 3,它可能大于 3 或小于 ,具体取决于响应
  • @Aleena:我已经实现了你的要求!它应该适用于任意数量的合约节点 ;-)
  • 我得到了这个 2015-01-01+01:002015-06-28+02:002015-04-17+02:002016-06-28+02:00 这个属性的结果
猜你喜欢
  • 2017-06-18
  • 2018-04-14
  • 1970-01-01
  • 1970-01-01
  • 2014-07-21
  • 2020-06-05
  • 2016-07-03
  • 1970-01-01
  • 2020-07-10
相关资源
最近更新 更多