如何使用Java更新xml中的值



如何编辑已添加到stringbuilder上的xml值?

我们有一个xml文件,看起来像下面这样,我们最终在Java中读取:

<?xml version="1.0" encoding="UTF-8"?>
<urn:receive
xmlns:urn="urn:xxx"
xmlns:ns="xxx"
xmlns:ns1="xxx"
xmlns:urn1="urn:xxx">
<urn:give>
<urn:giveNumber>
<ns1:number>12345678</ns1:number>
</urn:giveNumber>
<urn:giveDates>
<urn1:dateFrom>2021-07-01</urn1:dateFrom>
<urn1:dateTo>2021-09-30</urn1:dateTo>
</urn:giveDates>
</urn:give>
</urn:receive>

下面是我们用来读取xml文件的代码片段,通过附加到stringbuilder并最终将其保存为带有.toString()的字符串。请注意,对于number有一个int,对于startDate和endDate有一个string。这些值必须插入到xml中,并替换数字和日期。请记住,我们不允许编辑xml文件。

public class test {
// Logger to print output in commandprompt
private static final Logger LOGGER = Logger.getLogger(test.class.getName()); 
public void changeDate() {
number = 44444444;
startDate = "2021-01-01";
endDate   = "2021-03-31";
try {
// the XML file for this example
File xmlFile = new File("requests/dates.xml");
Reader fileReader = new FileReader(xmlFile);
BufferedReader bufReader = new BufferedReader(fileReader);
StringBuilder sb = new StringBuilder();
String line = bufReader.readLine();
while( line != null ) {
sb.append(line).append("n");
line = bufReader.readLine();
}
String request = sb.toString();
LOGGER.info("Request" + request);
} catch (Exception e) {
e.printStackTrace();
}
}
}

我们如何用数字,startDate和endDate替换xml中的数字和日期,但不编辑xml文件?

LOGGER.info("Request" + request);应该打印以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<urn:receive
xmlns:urn="urn:xxx"
xmlns:ns="xxx"
xmlns:ns1="xxx"
xmlns:urn1="urn:xxx">
<urn:give>
<urn:giveNumber>
<ns1:number>44444444</ns1:number>
</urn:giveNumber>
<urn:giveDates>
<urn1:dateFrom>2021-01-01</urn1:dateFrom>
<urn1:dateTo>2021-03-31</urn1:dateTo>
</urn:giveDates>
</urn:give>
</urn:receive>

简单的回答:你没有。

您需要解析XML,解析XML可以通过向解析器提供文件名轻松完成;首先将XML读入StringBuilder是毫无意义的努力。

对XML文档进行微小更改的最简单方法是使用XSLT,它可以很容易地从Java调用。Java带有内置的XSLT 1.0处理器。XSLT 1.0已经过时了,您可能更喜欢使用XSLT 3.0,它更强大,但需要第三方库;但是对于这样简单的工作,1.0就足够了。所需的样式表包含一个通用规则,它可以不加修改地复制内容:

<xsl:template match="*">
<xsl:copy><xsl:apply-templates/></xsl:copy>
</xsl:template>

,然后是一些规则来改变你想改变的东西:

<xsl:param name="number"/>
<xsl:param name="startDate"/>
<xsl:param name="endDate"/>
<xsl:template match="ns1:giveNumber/text()" xmlns:ns1="xxx">
<xsl:value-of select="$number"/>
</xsl:template>
<xsl:template match="urn1:dateFrom/text()" xmlns:urn1="urn:xxx">
<xsl:value-of select="$dateFrom"/>
</xsl:template>
<xsl:template match="urn1:dateTo/text()" xmlns:urn1="urn:xxx">
<xsl:value-of select="$dateTo"/>
</xsl:template>

,然后您只需从Java运行转换,如https://docs.oracle.com/javase/tutorial/jaxp/xslt/transformingXML.html所述,为参数提供值。

最新更新