xml到json,再回到java中的xml

vof42yt1  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(445)

我使用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"}}}}

命名空间定义丢失。但是,我计划将名称空间定义存储在一个Map中。
我使用jackson/org.json[都返回类似的结果]将其转换回xml,得到以下xml:

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

我唯一无法理解的部分是添加名称空间定义的方法,假设我可以将该信息存储在Map中。
我考虑添加一个 <root> </root> 所有的名称空间都在其中,正如w3c标准所规定的那样,这是一种有效的方法。但是soap不接受这样的xml。
有没有办法用正确的名称空间信息获取xml?

eanckbw9

eanckbw91#

当您说您使用xslt进行转换时,我想这意味着您是“手工”进行转换,而不是使用XSLT3.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-to-json转换器来生成这样的声明。你所采用的准则
<xsl:apply-templates select=“@*”mode=“attr”/>
在第39行处理属性。在XSLT2.0+中,可以使用select=“namespace::*”以相同的方式处理名称空间。然而,iirc是正确的,XSLT1.0不能匹配模式中的名称空间节点,因此如果您停留在1.0上,您需要使用

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

相关问题