gpt4 book ai didi

java - 如何使用 xpath 编辑特定的 xml

转载 作者:行者123 更新时间:2023-11-30 02:13:51 26 4
gpt4 key购买 nike

我得到了下面的 xml,它是使用 xslt 函数 json-to-xml() 生成的。我需要使用给定的 xpath 更新此 xml,如结果 xml 中所示。我需要 java 或 xslt 中的解决方案。任何帮助将非常感激。

XML

 <?xml version="1.0" encoding="UTF-8"?>
<map xmlns="http://www.w3.org/2005/xpath-functions">
<map key="Response">
<map key="Headers">
<string key="server">Lisa</string>
<string key="Status-Code">200</string>
<string key="Content-Type">applicaton/json</string>
</map>
<map key="Payload">
<map key="root">
<array key="cars">
<map>
<string key="company">ccc</string>
<string key="model">mmm</string>
</map>
<map>
<string key="strength">666</string>
<string key="Capacity">333</string>
</map>
</array>
<array key="bikes">
<map>
<string key="company">abc</string>
<string key="model">2018</string>
</map>
</array>
</map>
</map>
</map>
</map>

XPATH

/Response/Payload/root/cars[2]/strength=999
/Response/Payload/root/bikes/model=2019
/Response/Headers/server=WebSphere
/Response/Headers/Content-Type=text
/Response/Payload/root/cars[2]/Capacity=555
/Response/Payload/root/cars[1]/model=mmm1
/Response/Payload/root/bikes/company=xyz
/Response/Payload/root/cars[1]/company=ccc1
/Response/Headers/Status-Code=400

更新结果 XML

<map xmlns="http://www.w3.org/2005/xpath-functions">
<map key="Response">
<map key="Headers">
<string key="server">WebSphere</string>
<string key="Status-Code">400</string>
<string key="Content-Type">text</string>
</map>
<map key="Payload">
<map key="root">
<array key="cars">
<map>
<string key="company">ccc1</string>
<string key="model">mmm1</string>
</map>
<map>
<string key="strength">999</string>
<string key="Capacity">555</string>
</map>
</array>
<array key="bikes">
<map>
<string key="company">xyz</string>
<string key="model">2019</string>
</map>
</array>
</map>
</map>
</map>
</map>

我的尝试
我尝试使用 xslt 函数将此 xml 转换回 json,然后使用 com.jayway.jsonpath Jayway JsonPath用于解析/更改给定 xpath 上 json 值的库。最后使用 xslt 函数再次将该 json 更改为 xml。这对我来说就像魅力一样!但是在使用这个库之后,我开始在应用程序的其他部分遇到问题:(。所有带有 json 请求正文的 post 请求开始给出 400 错误。错误是“错误 400 客户端发送的请求在语法上不正确”。我无法不明白这个问题,可能是由于不同的 jar 冲突造成的。所以我正在尝试其他的工作方式。还有其他类似 Jayway JsonPath 的库吗?或者任何其他解决方案/建议都会有很大帮助。

最佳答案

给定 XSLT 3 的一种方法可能是将您拥有的路径转换为 ​​XSLT 3 匹配模板,然后创建一个可以使用 transform 函数执行的样式表 ( https://www.w3.org/TR/xpath-functions/#func-transform ):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:axsl="http://www.w3.org/1999/XSL/Transform-alias"
exclude-result-prefixes="xs"
version="3.0">

<xsl:namespace-alias stylesheet-prefix="axsl" result-prefix="xsl"/>

<xsl:output method="xml" indent="yes"/>

<xsl:param name="paths" as="xs:string">/Response/Payload/root/cars[2]/strength=999
/Response/Payload/root/bikes[1]/model=2019
/Response/Headers/server=WebSphere
/Response/Headers/Content-Type=text
/Response/Payload/root/cars[2]/Capacity=555
/Response/Payload/root/cars[1]/model=mmm1
/Response/Payload/root/bikes[1]/company=xyz
/Response/Payload/root/cars[1]/company=ccc1
/Response/Headers/Status-Code=400</xsl:param>

<xsl:param name="path-sequence" as="xs:string*" select="tokenize($paths, '\s+')!normalize-space()"/>

<xsl:variable name="stylesheet">
<axsl:stylesheet version="3.0">
<axsl:mode on-no-match="shallow-copy"/>

<xsl:for-each select="($path-sequence)">
<xsl:variable name="steps" select="tokenize(., '/')"/>
<axsl:template>
<xsl:attribute name="match">
<xsl:apply-templates select="tail($steps)" mode="step"/>
</xsl:attribute>
<axsl:copy>
<axsl:copy-of select="@*"/>
<xsl:value-of select="substring-after($steps[last()], '=')"/>
</axsl:copy>
</axsl:template>
</xsl:for-each>

</axsl:stylesheet>
</xsl:variable>

<xsl:template match=".[not(contains(., '[')) and not(contains(., '='))]" mode="step">
<xsl:if test="position() gt 1">/</xsl:if>
<xsl:sequence select="'*[@key = ''' || . || ''']'"/>
</xsl:template>

<xsl:template match=".[contains(., '=')]" mode="step">
<xsl:if test="position() gt 1">/</xsl:if>
<xsl:sequence select="'*[@key = ''' || substring-before(., '=') || ''']'"/>
</xsl:template>

<xsl:template match=".[contains(., '[')]" mode="step">
<xsl:if test="position() gt 1">/</xsl:if>
<xsl:sequence select="'*[@key = ''' || substring-before(., '[') || ''']/*[' || replace(., '^[^\[]+\[([0-9]+)\]', '$1') || ']'"/>
</xsl:template>

<xsl:template match="/">
<xsl:sequence select="transform(map {
'source-node' : .,
'stylesheet-node' : $stylesheet
})?output"/>
</xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/jyyiVhv/1我得到了想要的结果

<?xml version="1.0" encoding="UTF-8"?>
<map xmlns="http://www.w3.org/2005/xpath-functions">
<map key="Response">
<map key="Headers">
<string key="server">WebSphere</string>
<string key="Status-Code">400</string>
<string key="Content-Type">text</string>
</map>
<map key="Payload">
<map key="root">
<array key="cars">
<map>
<string key="company">ccc1</string>
<string key="model">mmm1</string>
</map>
<map>
<string key="strength">999</string>
<string key="Capacity">555</string>
</map>
</array>
<array key="bikes">
<map>
<string key="company">xyz</string>
<string key="model">2019</string>
</map>
</array>
</map>
</map>
</map>
</map>

尽管我必须将包括 bikes 在内的路径调整为 bikes[1]

关于java - 如何使用 xpath 编辑特定的 xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49225689/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com