Java XML getAttribute

#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.