JAVA XML - How do I get specific elements in an XML Node?

后端 未结 2 1850
我寻月下人不归
我寻月下人不归 2021-01-05 04:14

This is an academic assignment and we are given an extremely large XML file with hundreds of entries like these. For each item we are supposed to list the Manager\'s ID, the

相关标签:
2条回答
  • 2021-01-05 04:43

    If you are trying to read person attribute of manager tag, you can do it as shown below -

    import java.io.IOException;
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    import org.xml.sax.SAXException;
    
    
    public class Test{
    
    public static void main (String[] args)
    {
        Test test = new Test();
        test.readXML();
    }
    
    private void readXML()
    {
        Document doc = null;
        try 
        {
            doc = parseXML("/home/abc/Test.xml");
        } 
        catch (ParserConfigurationException e) 
        {
            e.printStackTrace();
        } 
        catch (SAXException e) 
        {
            e.printStackTrace();
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        }
    
        if(doc != null)
        {
            NodeList nList = doc.getElementsByTagName("item_list");
            for (int i = 0; i < nList.getLength(); i++) 
            {
                Node nNode = nList.item(i);
                Element eElement = (Element) nNode;
                Element cElement =  (Element) eElement.getElementsByTagName("manager").item(0);
                System.out.println("Manager ID : " + cElement.getAttribute("person"));
            }
        }
    }
    
    private Document parseXML(String filePath) throws ParserConfigurationException, SAXException, IOException
    {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(filePath);
        doc.getDocumentElement().normalize();
        return doc;
    }
    }
    
    0 讨论(0)
  • 2021-01-05 04:52

    Or, using xml you might need to edit the initial content. I suggest the following approach

    import java.io.IOException;
    import java.io.StringWriter;
    
    import javax.xml.parsers.*;
    import javax.xml.transform.*;
    import javax.xml.transform.dom.DOMSource;
    import javax.xml.transform.stream.StreamResult;
    
    import org.w3c.dom.*;
    import org.xml.sax.SAXException;
    
    
    public class ReadXML {
    
        public static void main(String[] args) {
            try {
                Document doc = getDocument("/home/abc/Test.xml");
    
                System.out.println(getString(getNodeByName(doc,"item_list01")));
            } catch (TransformerException | ParserConfigurationException | IOException | SAXException e) {
                // Log e.printStackTrace();
            }
        }
    
        private static Document getDocument(String filePath) throws ParserConfigurationException, IOException, SAXException {
            DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
            DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
    
            return docBuilder.parse(filePath);
        }
    
        private static String getString(Node node) throws TransformerException {
            StringWriter sw = new StringWriter();
            Transformer t = TransformerFactory.newInstance().newTransformer();
            t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
            t.setOutputProperty(OutputKeys.INDENT, "yes");
            t.transform(new DOMSource(node), new StreamResult(sw));
    
            return sw.toString();
        }
    
        public static Node getNodeByName(Document doc, String nodeName) {
            Node node = null;
            for (int i = 0; i < doc.getDocumentElement().getChildNodes().getLength(); i++) {
                if (!getTagName(doc, i).equals("#text")) {
                    for (int j = 0; j < getNodeName(doc, i).getChildNodes().getLength(); j++) {
                        if (getNodeName(doc, i, j).equalsIgnoreCase("item_list")  && getNodeAttributes(doc,i,j).equalsIgnoreCase(nodeName)) {
                            node = getNodeName(doc, i);
                        }
                    }
                }
            }
            return node;
        }
    
        private static String getTagName(Document doc, int i) {
            return getNodeName(doc, i).getNodeName();
        }
    
        private static Node getNodeName(Document doc, int i) {
            return (doc.getDocumentElement().getChildNodes().item(i));
        }
    
        private static String getNodeName(Document doc, int i, int j) {
            return getNodeName(doc, i).getChildNodes().item(j).getNodeName();
        }
        private static String getNodeAttributes(Document doc, int i, int j) {
            if(getNodeName(doc, i).getChildNodes().item(j).hasAttributes()){
                return getNodeName(doc, i).getChildNodes().item(j).getAttributes().item(0).getNodeValue();
            }
            return "";
        }
    }
    
    0 讨论(0)
提交回复
热议问题