来自Java DOM getAttribute的意外结果

时间:2016-01-29 17:09:36

标签: java xml dom

我的Java DOM解析器遇到了一些问题。我试图解析整个XML文档,并根据它在文档中的显示方式将所有内容保存到字符串或数组列表中。现在我特别遇到了一个问题。我试图在这里解析元素的子值的属性:

-<Ntfctn>

      <Id>161RD2521JI00XSZ</Id>

      <CreDtTm>2016-01-27T13:25:21</CreDtTm>

      +<Acct>

      +<TxsSummry>

      +<Ntry xmlns="urn:iso:std:iso:20022:tech:xsd:camt.054.001.04">

正如您所看到的,Ntfctn下有两个元素包含属性Id和CreDtTm。现在我真正需要的只是&#34; Id&#34;。我已经在代码中提前收集了信用额度。有很多&#34; Id&#34;整个XML中的标签所以呼叫&#34; Id&#34;直接赢了工作。

我试过用这种方式调用属性:

NodeList Ntfctn = doc.getElementsByTagName("Ntfctn");

            for(int temp = 0; temp < MsgRcpt.getLength(); temp++){
                System.out.println(Ntfctn.item(0).getAttributes());
            }

但得到一些意想不到的结果

com.sun.org.apache.xerces.internal.dom.AttributeMap@2a139a55

我已经尝试将Ntfctn.get值更改为多个数字,但似乎没有任何数字可以提取我想要的内容。我的代码的其他方面工作得很好。我将在下面发布整个内容。

请让我知道从文件中具有相同名称的属性获取值的正确方法。

package parsing;

import java.io.File;
import org.w3c.dom.*;

import javax.xml.parsers.*;
import java.io.*;

public class XMLParser 

{

    public static String CreDtTmS;
    public static String MsgIdS; 
    public static String MsgRcptS;
    public static String NtfctnS;

    public void parseXML(){

        try{

            File inputFile = new File("C:\\Users\\jhamric\\Desktop\\Camt54.xml");
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(inputFile);
            doc.getDocumentElement().normalize();

            NodeList CreDtTm = doc.getElementsByTagName("CreDtTm");

            for(int temp = 0; temp < CreDtTm.getLength(); temp++){
                CreDtTmS = CreDtTm.item(0).getTextContent();
            }

            NodeList MsgId = doc.getElementsByTagName("MsgId");

            for(int temp = 0; temp < MsgId.getLength(); temp++){
                MsgIdS = MsgId.item(0).getTextContent();
            }

            NodeList MsgRcpt = doc.getElementsByTagName("MsgRcpt");

            for(int temp = 0; temp < MsgRcpt.getLength(); temp++){
                MsgRcptS = MsgRcpt.item(0).getTextContent();
            }

            NodeList Ntfctn = doc.getElementsByTagName("Ntfctn");

            for(int temp = 0; temp < MsgRcpt.getLength(); temp++){
                System.out.println(Ntfctn.item(0).getAttributes());
            }


        }catch (Exception e){
            e.printStackTrace();
        }

        System.out.println("GrpHdr -> CreDtTm: "+CreDtTmS);
        System.out.println("GrpHdr -> MsgId: "+MsgIdS);
        System.out.println("GrpHdr -> MsgRcpt -> Id -> OrgId -> Othr -> Id: "+MsgRcptS);


    }

}

使用下面接受的答案的帮助回答了这个问题。

经过反复试验,这是一段有效的代码:

XPathFactory factory = XPathFactory.newInstance();
            XPath xpath = factory.newXPath();
            XPath xPath =XPathFactory.newInstance().newXPath();

            XPathExpression expr = xpath.compile("//Ntfctn/Id");
            Object result = expr.evaluate(doc, XPathConstants.NODESET);
            NodeList nodes = (NodeList) result;
            System.out.println(nodes.getLength());
            for(int i = 0; i < nodes.getLength(); i++){
                Element el = (Element) nodes.item(i);
                System.out.println("Tag: "+ el.getNodeName());
                System.out.println(el.getTextContent());
            }

1 个答案:

答案 0 :(得分:1)

要优化您的选择,您可以使用xpath:

XPath xPath = XPathFactory.newInstance().newXPath();
NodeList nodes = (NodeList)xPath.evaluate("//Ntfctn/Id",
        doc.getDocumentElement(), XPathConstants.NODESET);