来自Java DOM getAttribute的意外结果

来自Java DOM getAttribute的意外结果,java,xml,dom,Java,Xml,Dom,我的DOM Java解析器有点问题。我试图解析整个XML文档,并根据它在文档中的显示方式将所有内容保存到字符串或数组列表中。现在我特别遇到了一个问题。我试图在此处解析元素的子值的属性: -<Ntfctn> <Id>161RD2521JI00XSZ</Id> <CreDtTm>2016-01-27T13:25:21</CreDtTm> +<Acct> +<TxsSu

我的DOM Java解析器有点问题。我试图解析整个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.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);


    }

}
包解析;
导入java.io.File;
导入org.w3c.dom.*;
导入javax.xml.parsers.*;
导入java.io.*;
公共类XMLParser
{
公共静态字符串CreDtTmS;
公共静态字符串MsgIdS;
公共静态字符串MsgRcptS;
公共静态字符串NTFCTN;
public void parseXML(){
试一试{
File inputFile=新文件(“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”);
对于(int-temp=0;tempCreDtTm:+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());
            }
XPathFactory=XPathFactory.newInstance();
XPath=factory.newXPath();
XPath=XPathFactory.newInstance().newXPath();
XPathExpression expr=xpath.compile(“//Ntfctn/Id”);
Object result=expr.evaluate(doc,XPathConstants.NODESET);
节点列表节点=(节点列表)结果;
System.out.println(nodes.getLength());
对于(int i=0;i
要优化选择,可以使用xpath:

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

如您所见,Ntfctn下有两个元素包含属性Id和CreDtTm。
否,它们不包含属性。它们包含文本节点,可以通过
节点获取。例如,getTextContent()
。请发布一个带有实际XML文档的文本节点(不是它在浏览器中的显示方式,带有额外的+和-位;将其加载到文本编辑器中)。到目前为止,您发布的代码不是最小的或完整的。请帮助我们帮助您。很抱歉Jon Skeet,但由于我的工作性质,我无法发布整个XML表。这实际上是付款记录,所以很明显我不能分享。不过,我希望这足以说明我的观点。当我尝试这样做时,似乎出现了一个错误,可能的解决方案是导入一个包(不确定是哪个包)或将其更改为newInstance().newXPathAPI。。建议?导入javax.xml.xpath.xpathfactory我按照您的建议导入了工厂,代码与上面的完全相同,但我收到一个错误:“xpath无法解析为类型”,谢谢。我需要一些额外的东西,但你帮我弄明白了。谢谢你的帮助!!
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());
            }
XPath xPath = XPathFactory.newInstance().newXPath();
NodeList nodes = (NodeList)xPath.evaluate("//Ntfctn/Id",
        doc.getDocumentElement(), XPathConstants.NODESET);