问题描述
|
我正在尝试从XML文档中获取属性ID(
fileID
),以用作XML拆分的文件名。拆分工作我只需要提取ѭ0用作名称即可。
我可以以此作为帮助。
这是我的xml文档
<root>
<envelope fileID=\"000152OP.XML\">
<record id=\"850\">
</record>
</envelope>
<envelope fileID=\"000153OP.XML\">
<record id=\"850\">
</record>
</envelope>
<envelope fileID=\"000154OP.XML\">
<record id=\"850\">
</record>
</envelope>
</root>
这是我的Java代码[已编辑],我现在可以读取属性,但它不会创建最后一个xml文件。因此,在我的示例中,它使用正确的名称创建了前2个文件,但未创建最后一个文件ID \“ 000154OP.XML \”。
public static void splitXMLFile (String file) throws Exception {
String[] temp;
String[] temp2;
String[] temp3;
String[] temp4;
String[] temp5;
String[] temp6;
File input = new File(file);
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
Document doc = dbf.newDocumentBuilder().parse(input);
XPath xpath = XPathFactory.newInstance().newXPath();
NodeList nodes = (NodeList) xpath.evaluate(\"//root/envelope\",doc,XPathConstants.NODESET);
int itemsPerFile = 1;
Node staff = doc.getElementsByTagName(\"envelope\").item(0);
NamednodeMap attr = staff.getAttributes();
Node nodeAttr = attr.getNamedItem(\"fileID\");
String node = nodeAttr.toString();
temp = node.split(\"=\");
temp2 = temp[1].split(\"^\\\"\");
temp3 = temp2[1].split(\"\\\\.\");
Document currentDoc = dbf.newDocumentBuilder().newDocument();
Node rootNode = currentDoc.createElement(\"root\");
File currentFile = new File(\"C:\\\\XMLFiles\\\\\" + temp3[0]+ \".xml\");
for (int i=1; i <= nodes.getLength(); i++) {
Node imported = currentDoc.importNode(nodes.item(i-1),true);
rootNode.appendChild(imported);
Node staff2 = doc.getElementsByTagName(\"envelope\").item(i);
NamednodeMap attr2 = staff2.getAttributes();
Node nodeAttr2 = attr2.getNamedItem(\"fileID\");
String node2 = nodeAttr2.toString();
temp4 = node2.split(\"=\");
temp5 = temp4[1].split(\"^\\\"\");
temp6 = temp5[1].split(\"\\\\.\");
if (i % itemsPerFile == 0) {
writetoFile(rootNode,currentFile);
rootNode = currentDoc.createElement(\"root\");
currentFile = new File(\"C:\\\\XMLFiles\\\\\" + temp6[0]+\".xml\");
}
}
writetoFile(rootNode,currentFile);
}
private static void writetoFile(Node node,File file) throws Exception {
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(new DOMSource(node),new StreamResult(new FileWriter(file)));
}
解决方法
也许您可以尝试以下xpath:
//root/envelope/record/@id
如果您使用的XPath库不支持整个XPath集,则可以尝试使用优质的库ѭ5
, ArrayList<String> files = new ArrayList<String>();
SAXBuilder builder = new SAXBuilder();
Document Doc;
try {
Doc = builder.build(new File(myxmlfile.xml));
Element root = Doc.getRootElement();
List<Element> category = root.getChildren();
for(int i=0 ; i < category.size(); i++) {
Element elem = category.get(i);
String file = elem.getAttributeValue(\"fileID\");
files.add(file);
}
} catch (Exception e) {
}
这将为您提供XML文件中fileId的数组列表。我已经使用SAX阅读器来解析XML。