2011-06-14 66 views
3

我試圖從我的XML文檔中獲取屬性ID(fileID)以用作我的XML拆分的文件名。拆分作品我只需要提取fileID作爲名稱。Java XML getAttribute

我可以用這個作爲對此的幫助。

這是我的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文件。因此,在我的示例中,它創建了具有正確名稱的前兩個文件,但最後一個文件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)));  
} 

回答

2

或許你可以嘗試以下XPath:

//root/envelope/record/@id 

如果你使用的是不支持整個XPath的集合中的XPath庫,你可以試試優庫jaxen

1
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文件中的fileIds數組列表。我用SAX閱讀器來解析XML。