如何从XML节点获取数据?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从XML节点获取数据?相关的知识,希望对你有一定的参考价值。

我正在努力从以下XML节点中获取数据。我使用DocumentBuilder来解析XML,我通常通过定义节点来获取节点的值,但在这种情况下我不确定节点是如何的。

<Session.openRs status="success" sessionID="19217B84:AA3649FE:B211FF37:E61A78F1:7A35D91D:48E90C41" roleBasedSecurity="1" entityID="1" />

这就是我通过标签名称获取其他标签的值的方法。

public List<NYProgramTO> getNYPPAData() throws Exception {
    this.getConfiguration();
    List<NYProgramTO> to = dao.getLatestNYData();
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    Document document = null;

    // Returns chunkSize
    /*List<NYProgramTO> myList = getNextChunk(to);
    ExecutorService executor = Executors.newFixedThreadPool(myList.size());
    myList.stream().parallel()
    .forEach((NYProgramTO nyTo) -> 
    {
        executor.execute(new NYExecutorThread(nyTo, migrationConfig , appContext, dao));
    });

    executor.shutdown();
    executor.awaitTermination(300, TimeUnit.SECONDS);
    System.gc();*/

    try {
        DocumentBuilder builder = factory.newDocumentBuilder();
        InputSource source = new InputSource();

        for(NYProgramTO nyProgram: to) {
            String reqXML = nyProgram.getRequestXML();
            String response = RatingRequestProcessor.postRequestToDC(reqXML, URL);
    //      dao.storeData(nyProgram);
            System.out.println(response);
            if(response != null) {
                source.setCharacterStream(new StringReader(response));
                document = builder.parse(source);

                NodeList list = document.getElementsByTagName(NYPG3Constants.SERVER);
                for(int iterate = 0; iterate < list.getLength(); iterate++){
                    Node node = list.item(iterate);

                    if(node.getNodeType() == Node.ELEMENT_NODE) {
                        Element element = (Element) node;
                        nyProgram.setResponseXML(response);
                        nyProgram.setFirstName(element.getElementsByTagName(NYPG3Constants.F_NAME).item(0).getTextContent());
                        nyProgram.setLastName(element.getElementsByTagName(NYPG3Constants.L_NAME).item(0).getTextContent());
                        nyProgram.setPolicyNumber(element.getElementsByTagName(NYPG3Constants.P_NUMBER).item(0).getTextContent());
                        nyProgram.setZipCode(element.getElementsByTagName(NYPG3Constants.Z_CODE).item(0).getTextContent());
                        nyProgram.setDateOfBirth(element.getElementsByTagName(NYPG3Constants.DOB).item(0).getTextContent());
                        nyProgram.setAgencyCode(element.getElementsByTagName(NYPG3Constants.AGENCY_CODE).item(0).getTextContent());
                        nyProgram.setLob(element.getElementsByTagName(NYPG3Constants.LINE_OF_BUSINESS).item(0).getTextContent());

                        if(element.getElementsByTagName(NYPG3Constants.SUBMISSION_NUMBER).item(0) != null){
                            nyProgram.setSubmissionNumber(element.getElementsByTagName(NYPG3Constants.SUBMISSION_NUMBER).item(0).getTextContent());
                        } else {
                            nyProgram.setSubmissionNumber("null");
                        }

我需要获取sessionId的值。我想知道的是节点,我相信它不可能。我正在通过标签名称检索值,那么在这种情况下标签名称是什么?

提前致谢

答案

您应该考虑使用XPath。至少对我而言,使用起来非常简单,在你的情况下,为了获得sessionID你可以尝试这样的事情:

XPath xPath = XPathFactory.newInstance().newXPath();
String expression = "/Session.openRs/@sessionID";

String sessionID = xPath.evaluate(expression,document);

您可以像这样获取“文档”:

Document document  = builder.newDocumentBuilder();

希望这可以帮助!!

以上是关于如何从XML节点获取数据?的主要内容,如果未能解决你的问题,请参考以下文章

从 XML 声明片段获取 XML 编码:部分内容解析不支持 XmlDeclaration

如何从 xmlnodelist 获取 xml 节点

我无法从我的 xml 中以 xsl 编码获取子循环中的根节点数据

如何从 XML 文件中按编号获取子节点

如何多次使用同一个片段?

如何从 Firebase 获取数据到 Recyclerview 中的片段?