0

ディレクトリ内の特定のパターンに一致するすべての XML ファイルを検索し、新しいタグを追加して変更するプログラムを作成しました。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<paths>
  <upgradepath startversion="1.4.0.0" moduleid="${moduleId}" endversion="1.4.0.1">
    <steps>
      <!-- Put scripts here to go from 1.4.0.0 to 1.4.0.1 -->
    </steps>
  </upgradepath>

  <upgradepath startversion="1.4.0.1" moduleid="${moduleId}" endversion="1.4.0.2">
    <steps>
      <!-- Put scripts here to go from 1.4.0.1 to 1.4.0.2 -->
    </steps>
  </upgradepath>
</paths>

プログラムを実行した後、XML ファイルは次のように変更されます。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<paths>
  <upgradepath endversion="1.4.0.1" moduleid="${moduleId}" startversion="1.4.0.0">
    <steps>
      <!-- Put scripts here to go from 1.4.0.0 to 1.4.0.1 -->
    </steps>
  </upgradepath>

  <upgradepath endversion="1.4.0.2" moduleid="${moduleId}" startversion="1.4.0.1">
	<steps>
	  <!-- Put scripts here to go from 1.4.0.1 to 1.4.0.2 -->
	</steps>
  </upgradepath>

<upgradepath endversion="1.4.0.3" moduleid="${moduleId}" startversion="1.4.0.2">
<steps>
<!--Put scripts here to go from 1.4.0.2 to 1.4.0.3-->
</steps>
</upgradepath>
</paths>

すべてのタグの属性を見ると、それらがすべて昇順で並べ替えられていることがわかります。startversion属性が最後に表示され、endversion属性が最初に表示されるようになりました。XML ファイルの変更後、属性の元の順序が必要です。私はほとんどすべてを試しましたが、すべての希望を失いました。これを行う方法はありますか?また、属性を降順に並べ替える方法はありますか? それは正しい解決策ではありませんが、役に立ちます。

ファイルの変更に使用しているプログラムのコード スニペットを次に示します。

private static void updateXMLFiles(String sStartVersion, String sEndVersion) {
  try {
    for (int c = 0; c < pathsList.size(); c++) {
      File xmlFile = new File(pathsList.get(c).toString());
      DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
      DocumentBuilder dBuilder;
      dBuilder = dbFactory.newDocumentBuilder();
      Document doc = dBuilder.parse(xmlFile);
      doc.getDocumentElement().normalize();
                
      // Get the last <upgradepath> tag in the file.
      // Method Call to verify the version entered and update the XML Files.

      // Write the updated document to the file.
      doc.getDocumentElement().normalize();
      TransformerFactory transformerFactory = TransformerFactory.newInstance();
      Transformer transformer = transformerFactory.newTransformer();
      DOMSource source = new DOMSource(doc);
      StreamResult result = new StreamResult(new File(pathsList.get(c).toString()));
      transformer.setOutputProperty(OutputKeys.STANDALONE, "yes");
      transformer.setOutputProperty(OutputKeys.INDENT, "yes");
      transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
      transformer.transform(source, result);
  } 
  catch (SAXException e1) {
    e1.printStackTrace();
  } 
  catch (ParserConfigurationException e1) {
    e1.printStackTrace();
  } 
  catch (IOException e1) {
    e1.printStackTrace();
  } 
  catch (TransformerException e1) {
    e1.printStackTrace();
  }
}

private static void addNewVersion(Document doc, String sStartVersion, String sEndVersion) {
    Element element = doc.getDocumentElement();
    Element upgradePath = doc.createElement("upgradepath");
    upgradePath.setAttribute("startversion", sStartVersion);
    upgradePath.setAttribute("moduleid", "${moduleId}");
    upgradePath.setAttribute("endversion", sEndVersion);
    Element steps = doc.createElement("steps");
    Comment comment = doc.createComment("Put scripts here to go from " + sStartVersion + " to " + sEndVersion);
    steps.appendChild(comment);
    upgradePath.appendChild(steps);
    element.appendChild(upgradePath);
}

属性の順序をそのまま維持したり、最悪の場合、降順に並べ替えたりする方法はありますか? 私の友人は、JAXB を試してみることを提案しましたが、これを実現する方法を見つけることができませんでした。誰かが JAXB でこれを解決できると考えている場合は、既存の XML ファイルを作成するのではなく、フォーマットする方法について言及してください。大きな懸念事項ではないもう 1 つの問題は、
transformer.setOutputProperty(OutputKeys.INDENT, "yes");を使用しましたが、
新しく追加されたタグが正しくインデントされていません。これを修正する方法はありますか?

4

1 に答える 1