Java XML 获取属性

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/6341203/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-30 15:28:51  来源:igfitidea点击:

Java XML getAttribute

javaxml

提问by Eve

I'm trying to get an attribute id (fileID) from my XML document to use as the filename for my XML split. The split works I just need to extract the fileIDto use as the name.

我试图fileID从我的 XML 文档中获取一个属性 id ( ) 以用作我的 XML 拆分的文件名。拆分工作我只需要提取fileID用作名称。

I could use this as help on this.

我可以用它作为这方面的帮助。

This is my xml document

这是我的 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>

And here's my Java code [EDITED] I can read the attribute now but it doesn't create the last xml file. So in my example it create the first 2 files with the correct name but last fileID "000154OP.XML" isn't created.

这是我的 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)));     
 } 

回答by Johan Sj?berg

Perhaps you can try the following xpath:

也许您可以尝试以下 xpath:

//root/envelope/record/@id

If the XPath library you're using does not support the entire XPath set you can try the excellent library jaxen

如果您使用的 XPath 库不支持整个 XPath 集,您可以尝试优秀的库 jaxen

回答by Balanivash

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) {

    }

This will give you an array list of the fileIds in the XML file. I've used the SAX reader to parse the XML.

这将为您提供 XML 文件中 fileIds 的数组列表。我使用 SAX 阅读器来解析 XML。