#java #xml
#java #xml
Вопрос:
Я пытаюсь получить идентификатор атрибута ( fileID
) из моего XML-документа, чтобы использовать его в качестве имени файла для моего разделения XML. Разделение работает, мне просто нужно извлечь fileID
для использования в качестве имени.
Я мог бы использовать это как справку по этому вопросу.
Это мой 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 файла с правильным именем, но с последним идентификатором файла «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)));
}
Ответ №1:
Возможно, вы можете попробовать следующий xpath:
//root/envelope/record/@id
Если используемая вами библиотека XPath не поддерживает весь набор XPath, вы можете попробовать отличную библиотеку jaxen
Ответ №2:
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-файле. Я использовал программу чтения SAX для синтаксического анализа XML.