【问题标题】:Parse weird xml response to usable object解析对可用对象的奇怪 xml 响应
【发布时间】:2017-02-21 08:51:44
【问题描述】:

我很高兴收到一个奇怪的 xml 响应 - xml:

<params>
    <param>
        <value><array><data>
            <value><string>UstId_1</string></value>
            <value><string>xxx</string></value>
        </data></array></value>
    </param>
    <param>
        <value><array><data>
            <value><string>ErrorCode</string></value>
            <value><string>200</string></value>
        </data></array></value>
    </param>
</params>

基本上,最内部的&lt;value&gt;&lt;string&gt; 构造通常是

<UstId_1>xxx</UstId_1>

<ErrorCode>200</ErrorCode>

分别使xml的消息归结为

<params>
    <UstId_1>xxx</UstId_1>
    <ErrorCode>200</ErrorCode>
</params>

但是这个 xml 是不同的。它是由税务机关退回的,所以没有办法让他们改变它。

我目前有这个pojo

@JacksonXmlRootElement(localName = "params")
public class Params {
    @JacksonXmlProperty(localName = "param")
    private List<Param> paramList = new ArrayList<>();

    //getter setter ...
}

和参数:

public class Param {
    @JacksonXmlProperty(localName = "value")
    private Object value;
    @JacksonXmlProperty(localName = "array")
    private Object array;
    @JacksonXmlProperty(localName = "data")
    private Object data = new ArrayList<>();
    //getter setter....
}

但这只会返回来自&lt;value&gt;&lt;string&gt; 的第二个条目,例如

xxx

200

这也是一个非常奇怪的结构

Params{paramList=[Param{value={array={data={value={string=xxx}}}}, array=null, data=null}
...

我将如何正确地为该 xml 设置一个 pojo 以使其能够做到

res.getUstId1();

【问题讨论】:

  • 在您的示例 XML 中,最后一行有未闭合的 标记。是文件的一部分还是文件中的错误?
  • 对不起,复制/粘贴错误,有很多 标签...

标签: java xml jackson


【解决方案1】:

也许不是您的目标,但 XSLT 会帮助您吗?您可以将 XML 转换为您可以轻松解析的内容。像这样的:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <xsl:template match="/">
    <params>
      <xsl:for-each select="/params/param/value/array/data">
        <xsl:element name="{value[1]/string}">
          <xsl:value-of select="value[2]/string"/>
        </xsl:element>
      </xsl:for-each>
    </params>
  </xsl:template>
</xsl:stylesheet>

小提琴:http://xsltransform.net/ejivdHU

【讨论】:

  • 我以前从未这样做过,但看起来很有趣。你能解释一下如何在java中使用它吗?
  • 基本上您将 XML 转换为不同的结构。在将其解析为对象之前,您必须根据税务机关的响应运行它。我不确定你的堆栈是什么样的,所以也许这些答案会对你有所帮助:stackoverflow.com/questions/4604497/xslt-processing-with-java
猜你喜欢
  • 2015-09-10
  • 2017-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
相关资源
最近更新 更多