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 文件而不是创建一个。另一个不是主要问题的问题是,虽然我使用了
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
新添加的标签没有正确缩进。有任何解决这个问题的方法吗?

4

1 回答 1

0
@XmlType(propOrder = {"startversion", "moduleid", "endversion", "steps"})
public class XmlSubModel {

    private String startversion = "";
    private String moduleid = "";
    private String endversion = "";
    private String steps = "";

    @XmlAttribute
    public String getStartversion() {
        return startversion;
    }

    public void setStartversion(String startversion) {
        this.startversion = startversion;
    }

    @XmlAttribute
    public String getModuleid() {
        return moduleid;
    }

    public void setModuleid(String moduleid) {
        this.moduleid = moduleid;
    }

    @XmlAttribute
    public String getEndversion() {
        return endversion;
    }

    public void setEndversion(String endversion) {
        this.endversion = endversion;
    }

    public String getSteps() {
        return steps;
    }

    public void setSteps(String steps) {
        this.steps = steps;
    }


}
于 2018-07-18T15:33:34.860 回答