我使用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?
1条答案
按热度按时间eanckbw91#
当您说您使用xslt进行转换时,我想这意味着您是“手工”进行转换,而不是使用XSLT3.0
xml-to-json()
函数(实际上在这里对您没有多大帮助)。但是如果你的代码有局限性,那么在没有看到代码的情况下很难帮助你。
通过使用名称空间轴很容易找到元素范围内的所有名称空间,我不确定您是否尝试了这个方法并弄错了,或者您是否不知道该特性。所以我们需要看看你的代码。
org.json转换器似乎接受命名空间声明,例如:
因此,您需要修改xml-to-json转换器来生成这样的声明。你所采用的准则
<xsl:apply-templates select=“@*”mode=“attr”/>
在第39行处理属性。在XSLT2.0+中,可以使用select=“namespace::*”以相同的方式处理名称空间。然而,iirc是正确的,XSLT1.0不能匹配模式中的名称空间节点,因此如果您停留在1.0上,您需要使用