我正在尝试根据找到的值读取/更新/删除 XML 文件。
我有一个名为 123456.xm
l 的 XML,格式如下。
<ps>
<p n="359" u="/ae/arabic/plan_book/plan_and_book.aspx"/>
<p n="277" u="/ae/english/plan_book/plan_and_book.aspx"/>
<p n="410" u="/ao/english/plan_book/plan_and_book.aspx"/>
</ps>
现在我在 java 中的新方法将获取文件路径 ( c://java/Files/12345.xml
)、n(277 - 将在文件中检查的值) 和 U ("/de/english/plan_book/plan_and_book.aspx")。
我的java方法的逻辑如下,但是真的不知道怎么写。
添加/附加方法逻辑:
- 打开文件
c://java/Files/12345.xml
- 搜索所有节点并找到 n(277) 值的基础。 277只会有一条记录
- 如果文件中存在此值,则不需要更新,否则在 xml 文件中添加新节点,例如,如果 n 的值本来是 (777),因为文件中不存在此属性记录,那么它会在文件 (
<p n="777" u="/ao/english/plan_book/plan_and_book.aspx"/>
) 中添加一条新记录。 - 将更新后的 XML 保存在同一位置。
删除方法逻辑:
- 打开文件
c://java/Files/12345.xml
- 搜索所有节点并根据 n(277) 的值进行查找。 277 只有一条记录。
- 如果该值存在于节点属性“n”中,那么它将从 xml 中删除该节点,否则不需要更新。
- 将更新后的 XML 保存在同一位置。
如果您分享上述实现的一些好的示例或链接,我们将不胜感激。
谢谢。
最佳答案
在 XSLT 中指定这种处理通常比在命令式语言中更容易和简单(不需要 regEx)。
可以直接使用下面的 XSLT 转换,或者它可以给出如何用另一种语言实现相同算法的想法:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pAction" select="'delete'"/>
<xsl:param name="pN" select="277"/>
<xsl:param name="pU" select="'/de/english/plan_book/plan_and_book.aspx'"/>
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ps">
<ps>
<xsl:apply-templates select=
"*[not($pAction = 'delete')]
|
*[$pAction = 'delete' and not(@n = $pN)]
"/>
<xsl:if test="$pAction = 'add' and not(p[@n = $pN])">
<p n="{$pN}" u="{$pU}"/>
</xsl:if>
</ps>
</xsl:template>
<xsl:template match="p">
<xsl:choose>
<xsl:when test="not(@n = $pN)">
<xsl:call-template name="identity"/>
</xsl:when>
<xsl:otherwise>
<xsl:if test="not($pAction = 'delete')">
<xsl:call-template name="identity"/>
</xsl:if>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
当此转换应用于提供的 XML 文档时:
<ps>
<p n="359" u="/ae/arabic/plan_book/plan_and_book.aspx"/>
<p n="277" u="/ae/english/plan_book/plan_and_book.aspx"/>
<p n="410" u="/ao/english/plan_book/plan_and_book.aspx"/>
</ps>
产生了想要的、正确的结果:
<ps>
<p n="359" u="/ae/arabic/plan_book/plan_and_book.aspx"/>
<p n="410" u="/ao/english/plan_book/plan_and_book.aspx"/>
</ps>
当参数$pAction
更改为时:
<xsl:param name="pAction" select="''add'"/>
然后转换的结果是相同的 XML 文档(未更改)。
当参数为时:
<xsl:param name="pAction" select="''add'"/>
XML 文档是:
<ps>
<p n="359" u="/ae/arabic/plan_book/plan_and_book.aspx"/>
<p n="410" u="/ao/english/plan_book/plan_and_book.aspx"/>
</ps>
那么结果是:
<ps>
<p n="359" u="/ae/arabic/plan_book/plan_and_book.aspx"/>
<p n="410" u="/ao/english/plan_book/plan_and_book.aspx"/>
<p n="277" u="/de/english/plan_book/plan_and_book.aspx"/>
</ps>
关于java - Java中如何使用节点属性值读取、更新和删除现有的XML文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10785743/