我需要从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>
答案 0 :(得分:1)
不。用单引号或双引号引起来的属性之间没有区别,要求两者之间有区别是不合理的要求。
StAX的工作不是保留其正在读取的XML文件语法。 StAX是一个解析器,其工作是中继以其正在读取的XML表示的数据模型。它可以完美地完成这项工作。
像您这样的要求可能会迫使您编写自己的XML库,因为您一开始不应该具有此要求。