java - Java中如何使用节点属性值读取、更新和删除现有的XML文件

标签 java xml regex xslt xpath

我正在尝试根据找到的值读取/更新/删除 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方法的逻辑如下,但是真的不知道怎么写。

添加/附加方法逻辑:

  1. 打开文件 c://java/Files/12345.xml
  2. 搜索所有节点并找到 n(277) 值的基础。 277只会有一条记录
  3. 如果文件中存在此值,则不需要更新,否则在 xml 文件中添加新节点,例如,如果 n 的值本来是 (777),因为文件中不存在此属性记录,那么它会在文件 (<p n="777" u="/ao/english/plan_book/plan_and_book.aspx"/>) 中添加一条新记录。
  4. 将更新后的 XML 保存在同一位置。

删除方法逻辑:

  1. 打开文件 c://java/Files/12345.xml
  2. 搜索所有节点并根据 n(277) 的值进行查找。 277 只有一条记录。
  3. 如果该值存在于节点属性“n”中,那么它将从 xml 中删除该节点,否则不需要更新。
  4. 将更新后的 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/

相关文章:

javascript - Javascript 中的 XML 文件,getElementByAttribute

c# - 正则表达式在线匹配,但在 C# 代码中不匹配

c++ - QRegExp 不匹配任何东西

java - 玩 scala,java.sql.date 抛出错误,尝试构建待办事项表单

java - SQL 返回搜索,即使检查不应该返回

java - Java 的 OpenMicroBlogging 库?

Java自动值

java - 我们可以在解码期间在运行时决定 jaxb 类吗?

android - 我可以在图形布局编辑器中预览操作栏吗?

javascript - YouTube 正则表达式 : Tested to pick up both video and playlist ID, 但 Node.js 不会