-1

私はxmlファイルを持っており、特定の属性に基づいて子要素を再配置しようとしています(以下の例では「id」の場合の値)。「bk103」が の最初の子になるように xml ファイルを書き直そうとしています。私の質問は、子要素をソートする方法に関するものではありません(「if」条件で実行できます)。xml ファイルを解析し、必要な順序で要素を xml ファイルに書き直す方法があるかどうか疑問に思っていました (書籍 ID の昇順など)。

これを行うにはどの方法を使用すればよいですか。また、誰かが同じことを行うアルゴリズムを提案できる場合。

<?xml version="1.0"?>
<catalog>
   <book id="bk101">
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>enter code here
      <genre>Computer</genre>
      <price>44.95</price>
      <publish_date>2000-10-01</publish_date>
      <description>An in-depth look at creating applications 
      with XML.</description>
   </book>
   <book id="bk102">
      <author>Ralls, Kim</author>
      <title>Midnight Rain</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2000-12-16</publish_date>
      <description>A former architect battles corporate zombies, 
      an evil sorceress, and her own childhood to become queen 
      of the world.</description>
   </book>
   <book id="bk103">
      <author>Corets, Eva</author>
      <title>Maeve Ascendant</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2000-11-17</publish_date>
      <description>After the collapse of a nanotechnology 
      society in England, the young survivors lay the 
      foundation for a new society.</description>
   </book>
</catalog>


Output:

<?xml version="1.0"?>
<catalog>
    <book id="bk103">
      <author>Corets, Eva</author>
      <title>Maeve Ascendant</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2000-11-17</publish_date>
      <description>After the collapse of a nanotechnology 
      society in England, the young survivors lay the 
      foundation for a new society.</description>
   </book>
<book id="bk102">
      <author>Ralls, Kim</author>
      <title>Midnight Rain</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2000-12-16</publish_date>
      <description>A former architect battles corporate zombies, 
      an evil sorceress, and her own childhood to become queen 
      of the world.</description>
   </book>
   <book id="bk101">
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>
      <genre>Computer</genre>
      <price>44.95</price>
      <publish_date>2000-10-01</publish_date>
      <description>An in-depth look at creating applications 
      with XML.</description>
   </book>


</catalog>
4

4 に答える 4

1

XQuery を使用<book/>して、XML 内のノードを再配置できます。

declare variable $input-document external;

<catalog>
{
  for $book in doc($input-document)/catalog/book
  let $id := $book/data(@id)
  order by $id descending
  return $book
}
</catalog>

Saxonのような XQuery エンジンを使用して、コマンド ラインから XML を変換します。

java -cp saxon9he.jar net.sf.saxon.Query input-document=input.xml reorder.xq 

saxon9he.jarは Saxon HE JAR であり、XQuery 変数はfile 内の XQuery の呼び出しに$input-documentバインドされています。'input.xml'reorder.xq

Java から XQuery を呼び出す必要がある場合は、XQJを使用して実行できます。

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.xml.namespace.QName;
import javax.xml.xquery.XQConnection;
import javax.xml.xquery.XQDataSource;
import javax.xml.xquery.XQException;
import javax.xml.xquery.XQPreparedExpression;
import javax.xml.xquery.XQSequence;

import net.sf.saxon.xqj.SaxonXQDataSource;


public class ReorderXml {

  public static void main(String[] args) throws XQException, IOException {

    // Use XQJ to execute an XQuery with Saxon HE
    XQDataSource ds = new SaxonXQDataSource();
    XQConnection conn = ds.getConnection();

    // InputStream for the XQuery
    InputStream query = new FileInputStream("reorder.xq");

    // Create a prepared expression ...
    XQPreparedExpression exp = conn.prepareExpression(query);

    // ... and bind the path to the input document to XQuery variable $input-document
    exp.bindString(new QName("input-document"), "data/input.xml", null);

    // Execute the query and ...
    XQSequence xqs = exp.executeQuery();

    // ... print the resulting document to standard out.
    xqs.writeSequence(System.out, null);

    // Clean up (production code should do that in a finally clause!)
    xqs.close();
    conn.close();
    query.close();
  }

}

ZorbaMXQueryなどの他の XQuery エンジンもあります。

于 2013-05-01T15:51:34.503 に答える
0

これでコンパレータを変更するだけです:

        Comparator<Element> comparator = (op1,op2) -> op2.getChildText(ID).compareTo(op1.getChildText(ID));    

シモーネ

于 2016-12-23T11:42:25.843 に答える