【问题标题】:XML to JSON and back to XML in JavaXML 到 JSON 并返回到 Java 中的 XML
【发布时间】:2020-08-22 04:51:26
【问题描述】:

我使用 XSLT 将 XML 转换为 JSON。我使用 XSLT 而不是 Jackson/org.json,因为 XSLT 保留了命名空间信息。

例如,对于下面的 SOAP XML 请求,

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <AccountDetailsRequest xmlns="http://com/blog/demo/webservices/accountservice">
      <accountNumber>12345</accountNumber>
    </AccountDetailsRequest>
  </soap:Body>
</soap:Envelope>

将其转换为以下 JSON。

{"soap:Envelope":{"soap:Body":{"AccountDetailsRequest":{"accountNumber":"12345"}}}}

命名空间定义丢失。但是,我打算将命名空间定义存储在地图中。

我使用 Jackson/org.json[都返回相似的结果] 将其转换回 XML,我得到以下 XML:

<soap:Envelope>
<soap:Body>
<AccountDetailsRequest>
   <accountNumber>12345</accountNumber>
</AccountDetailsRequest>
</soap:Body>
</soap:Envelope>

我唯一不知道的部分是添加命名空间定义的方法,假设我可以将该信息存储在地图中。

我考虑添加一个包含所有命名空间的&lt;root&gt; &lt;/root&gt;,因为 W3C 标准指定这是一种有效的方法。但是 SOAP 不接受这样的 XML。

有什么方法可以用正确的命名空间信息取回 XML?

【问题讨论】:

  • 使用 XML Dom setAttribute API 怎么样?
  • 如果必须在某个元素(不仅仅是根元素)上添加命名空间属性,您可以使用该元素的路径作为映射键。这个问题还包含一些关于这个主题的建议:stackoverflow.com/questions/4056419/…
  • Underscore-java库可以将xml转json并保存所有属性。

标签: java json xml xslt soap


【解决方案1】:

当您说您使用 XSLT 进行转换时,我猜这意味着您是“手动”进行的,而不是使用 XSLT 3.0 xml-to-json() 函数(实际上这对您没有多大帮助)这里有很多)。

但是如果你的代码有限制,那么不看你的代码就很难帮助你。

使用命名空间轴很容易找出元素范围内的所有命名空间,我不确定您是否尝试这样做并弄错了,或者您是否不知道该功能。这就是我们需要查看您的代码的原因。

似乎 org.json 转换器接受命名空间声明,例如:

String expectedStr = 
        "{\"addresses\":{\"address\":{\"name\":\"\",\"nocontent\":\"\","+
        "\"something\":[1, 2, 3]},\"xsi:noNamespaceSchemaLocation\":\"test.xsd\",\""+
        "xmlns:xsi\":\"http://www.w3.org/2001/XMLSchema-instance\"}}";

所以你需要修改你的 XML 到 JSON 的转换器来生成这样的声明。您采用的代码确实

在第 39 行处理属性。在 XSLT 2.0+ 中,您可以使用 select="namespace::*" 以相同的方式处理名称空间。但是 IIRC 正确,XSLT 1.0 无法匹配模式中的命名空间节点,所以如果你被困在 1.0 上,你需要使用类似的东西

<xsl:for-each select="namespace::*">
  ...
</xsl:for-each>

【讨论】:

  • 我使用此链接 gist.github.com/zygimantus/73d79dd405fbb8345bebea2cb354b926 中的 XSLT。我使用TransformerFactory transform 函数进行 XML 到 JSON 的转换。我使用 org.json XML.toString(json) 将其转换回 XML。结果是没有命名空间定义的 XML。
  • 感谢您的更新。我会试一试。我没有停留在 XSLT 1.0 上。 2.0 是否有类似的 XSLT?我可以使用它。
猜你喜欢
  • 1970-01-01
  • 2014-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-07
  • 1970-01-01
  • 1970-01-01
  • 2017-06-11
相关资源
最近更新 更多