Java StAX解析器:不保留属性的双引号

时间:2018-07-26 09:30:05

标签: java xml attributes stax

我需要从xml中的特定节点进行深度复制,并复制所有子节点/值/属性,而无需任何转换。

问题在于StAX解析器将属性周围的双引号转换为单引号。

是否可以禁用此功能?

任何帮助将不胜感激。太感谢了!! :)

输入文件:

<root>
    <mySubTrees>
        <mySubTree>
            <a property="target">
                <aa>123</aa>
            </a>
            <b>456</b>
            <c>789</c>
        </mySubTree>
    </mySubTrees>
</root>

代码:

public void makeSubTree(String formulaePathStr, String formulaeFilesList) {

    boolean bMySubTree = false;
    String mySubTree = "";

    try {

        //StAX
        XMLInputFactory factory = XMLInputFactory.newInstance();
        factory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, false);
        factory.setProperty(XMLInputFactory.IS_COALESCING, true);
        factory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
        XMLEventReader eventReader = factory.createXMLEventReader(new FileReader(formulaePathStr + "/" + formulaeFilesList));

        while (eventReader.hasNext()) {
            XMLEvent event = eventReader.nextEvent();

            if (bMySubTree) {
                mySubTree += event;
            }

            switch (event.getEventType()) {


                case XMLStreamConstants.START_ELEMENT:
                    StartElement startElement = event.asStartElement();
                    String qName = startElement.getName().getLocalPart();

                    if (qName.equalsIgnoreCase("mySubTree")) {
                        System.out.println("Start Element : mySubTree");
                        bMySubTree = true;
                    }

                    break;

                case XMLStreamConstants.END_ELEMENT:
                    EndElement endElement = event.asEndElement();

                    if (endElement.getName().getLocalPart().equalsIgnoreCase("mySubTree")) {
                        System.out.println("End Element : mySubTree");

                        try {

                            BufferedWriter writer = new BufferedWriter(new FileWriter(formulaePathStr + "/" + "mySubTree.xml", false));
                            writer.write("<mySubTree>" + mySubTree);
                            writer.close();

                            //reset all variables
                            bMySubTree = false;
                            mySubTree = "";

                        } catch (Exception e) {
                            e.printStackTrace();
                        }

                    }

                    break;
            }
        }
    }
    catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    catch(XMLStreamException e) {
        e.printStackTrace();
    }
}

当前(即不正确)输出:

<mySubTree>
    <a property='target'>
        <aa>123</aa>
    </a>
    <b>456</b>
    <c>789</c>
</mySubTree>

所需的输出:

<mySubTree>
    <a property="target">
        <aa>123</aa>
    </a>
    <b>456</b>
    <c>789</c>
</mySubTree>

1 个答案:

答案 0 :(得分:1)

不。用单引号或双引号引起来的属性之间没有区别,要求两者之间有区别是不合理的要求。

StAX的工作不是保留其正在读取的XML文件语法。 StAX是一个解析器,其工作是中继以其正在读取的XML表示的数据模型。它可以完美地完成这项工作。

像您这样的要求可能会迫使您编写自己的XML库,因为您一开始不应该具有此要求。