Java-反向XML属性

Java-反向XML属性,java,xml,dom,Java,Xml,Dom,下面的代码是使用DOM解析器反转XML。一切正常,但问题是属性没有反转 例如: 结果应该是 如何反转XML属性 public static void main(String[] args) throws Exception { reverseChildElements(); } public static void reverseChildElements() { DocumentBuilderFactory factory = DocumentBuilderFactory.

下面的代码是使用DOM解析器反转XML。一切正常,但问题是属性没有反转 例如: 结果应该是

如何反转XML属性

public static void main(String[] args) throws Exception {
    reverseChildElements();
}

public static void reverseChildElements() {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    Document doc = null;
    try {
        DocumentBuilder builder = factory.newDocumentBuilder();
        // Parse the input xml file
        doc = builder.parse("file.xml");
        Node firstChild = doc.getFirstChild();
        reverseChildNodes(firstChild);
        doc.replaceChild(firstChild, doc.getFirstChild());
        outputXml(doc);
    } catch (ParserConfigurationException | SAXException | IOException | TransformerException e) {
        e.printStackTrace();
    }
}

private static void reverseChildNodes(Node firstChild) {
    NodeList childNodes = firstChild.getChildNodes();
    Stack<Node> nodeStack = new Stack<Node>();
    // Put all the nodes into a Stack
    for (int i = 0; i < childNodes.getLength(); i++) {
        reverseChildNodes(childNodes.item(i));
        revereseAttributes(childNodes.item(i));
        nodeStack.push(childNodes.item(i));
    }
    // This is the last one which we entered
    while (!nodeStack.empty()) {
        firstChild.appendChild(firstChild.removeChild(nodeStack.pop()));
    }
}

private static void revereseAttributes(Node item) {
    if(item.hasAttributes() && item.getAttributes().getLength() > 1){
        NamedNodeMap attributesMap = item.getAttributes();
        List<Node> nodeStack = new ArrayList<Node>();
        for (int i = 0; i < attributesMap.getLength(); i++) {
            nodeStack.add(attributesMap.item(i));
        }
        for (Node node : nodeStack) {
            attributesMap.removeNamedItem(node.getNodeName());
            Attr atr = node.getOwnerDocument().createAttribute(node.getNodeName());
            atr.setValue(node.getNodeValue());
            attributesMap.setNamedItem(atr);
        }
    }

}

private static void outputXml(Document doc) throws TransformerException {
    TransformerFactory tf = TransformerFactory.newInstance();
    StringWriter writer = null;
        Transformer transformer = tf.newTransformer();
        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION,
                "yes");
        writer = new StringWriter();

        transformer.transform(new DOMSource(doc), new StreamResult(writer));
    System.out.println(writer.toString().replaceAll( "(?s)<!--.*?-->", "" ));
}
publicstaticvoidmain(字符串[]args)引发异常{
反向剪切();
}
公共静态void reverseChillements(){
DocumentBuilderFactory工厂=DocumentBuilderFactory.newInstance();
单据单据=空;
试一试{
DocumentBuilder=factory.newDocumentBuilder();
//解析输入xml文件
doc=builder.parse(“file.xml”);
Node firstChild=doc.getFirstChild();
反向希尔德节点(第一个孩子);
doc.replaceChild(firstChild,doc.getFirstChild());
输出xml(doc);
}捕获(ParserConfiguration异常| SAXException | IOException | TransformerException e){
e、 printStackTrace();
}
}
私有静态void reverseChildNodes(节点第一个子节点){
NodeList childNodes=firstChild.getChildNodes();
堆栈节点堆栈=新堆栈();
//将所有节点放入堆栈中
对于(int i=0;i1){
NamedNodeMap AttributeMap=item.getAttributes();
List nodeStack=new ArrayList();
对于(int i=0;i
根据定义,XML属性不是有序的。它们在XML文档中的外观(在其包含元素中)完全取决于某些XML编写器的实现

任何XML处理器都不能基于属性出现顺序的任何逻辑


也就是说,您应该满足于能够反转元素。

根据定义,XML属性不是有序的。它们在XML文档中的外观(在其包含元素中)完全取决于某些XML编写器的实现

任何XML处理器都不能基于属性出现顺序的任何逻辑


也就是说,您应该满足于能够反转元素。

根据定义,XML属性不是有序的。它们在XML文档中的外观(在其包含元素中)完全取决于某些XML编写器的实现

任何XML处理器都不能基于属性出现顺序的任何逻辑


也就是说,您应该满足于能够反转元素。

根据定义,XML属性不是有序的。它们在XML文档中的外观(在其包含元素中)完全取决于某些XML编写器的实现

任何XML处理器都不能基于属性出现顺序的任何逻辑

也就是说,您应该满足于能够反转元素