3

見つかった値に基づいて 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 の新しいメソッドは、Filepath ( 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 のレコードは 1 つだけです。
  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 のレコードは 1 つだけです。
  3. この値がノード属性「n」に存在する場合、xml からそのノードが削除されます。それ以外の場合、更新は必要ありません。
  4. 更新された XML を同じ場所に保存します。

上記の実装の良い例やリンクを共有していただければ幸いです。

ありがとう。

4

2 に答える 2

3

この種の処理は通常、命令型言語よりもXSLTで指定する方が簡単で簡単です(正規表現は不要です)

以下の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>
于 2012-05-28T14:37:24.200 に答える
1

XML が提供したサンプルと同じくらい単純である場合にのみ、これを使用できます。

<p>次のコードは、要素のすべての一致を反復処理します。

try {
    Pattern regex = Pattern.compile("(?is)(<p n=\"(\\d+)\" u=\"([^\"<>]+?)\"/>)");
    Matcher regexMatcher = regex.matcher(subjectString);
    while (regexMatcher.find()) {
        // matched text: regexMatcher.group()
        // match start: regexMatcher.start()
        // match end: regexMatcher.end()
    } 
} catch (PatternSyntaxException ex) {
    // Syntax error in the regular expression
}

特定の番号を持つ特定のノード (文字列と言ったほうがよい) を見つけるには、次の構文を使用します。

(?is)(<p n="#num_to_find#" )(u="[^"<>]+?"/>)

#num_to_find#選択した番号で変更する場所。そして、次のように置き換えることができます:

$1#string_to_replacewith##

正規表現の説明

"(?is)" +                       // Match the remainder of the regex with the options: case insensitive (i); dot matches newline (s)
"(" +                           // Match the regular expression below and capture its match into backreference number 1
   "<p\\ n=\"#num_to_find#\"\\ " +     // Match the characters “&lt;p n="#num_to_find#" ” literally
")" +
"(" +                           // Match the regular expression below and capture its match into backreference number 2
   "u=\"" +                         // Match the characters “u="” literally
   "[^\"<>]" +                      // Match a single character NOT present in the list “"<>”
      "+?" +                          // Between one and unlimited times, as few times as possible, expanding as needed (lazy)
   "\"/>" +                         // Match the characters “"/>” literally
")"  

お役に立てれば。

于 2012-05-28T14:18:20.743 に答える