DOM4J Parse不返回任何子节点

我正在尝试开始编写一个程序,该程序使用DOM4j,我希望解析XML文件,将其保存到某些表中,最后允许用户操作数据。

不幸的是,我坚持最基本的步骤,即解析。

以下是我试图包含的XML部分:

    000022222 

当我试图找到我的XML的根时,它确实将root正确地返回为“Document”。 当我尝试从Document获取子节点时,它也正确地给了我“BkToCstmrDbtCdtNtfctn”。 问题是,当我尝试进一步从“Bk”获得子节点时,我不能。 我在控制台中得到这个:

 org.dom4j.tree.DefaultElement@2b05039f [Element: ] 

这是我的代码,我将不胜感激任何反馈。 最终我想要获得“MsgId”属性,但总的来说我只是想弄清楚如何更深入地解析XML,因为实际上它可能有大约25层。

 public static Document getDocument(final String xmlFileName){ Document document = null; SAXReader reader = new SAXReader(); try{ document = reader.read(xmlFileName); } catch (DocumentException e) { e.printStackTrace(); } return document; } public static void main(String args[]){ String xmlFileName = "C:\\Users\\jhamric\\Desktop\\Camt54.xml"; String xPath = "//Document"; Document document = getDocument(xmlFileName); Element root = document.getRootElement(); List nodes = document.selectNodes(xPath); for(Iterator i = root.elementIterator(); i.hasNext();){ Element element = (Element) i.next(); System.out.println(element); } for(Iterator i = root.elementIterator("BkToCstmrDbtCdtNtfctn");i.hasNext();){ Element bk = (Element) i.next(); System.out.println(bk); } } } 

最好的方法可能是使用XPath,但由于XML文档使用命名空间,因此不能在API中使用“简单”的selectNodes方法。 我将创建一个辅助方法来轻松评估DocumentElement级别上的任何XPath表达式:

 public static void main(String[] args) throws Exception { Document doc = getDocument(...); Map namespaceContext = new HashMap<>(); namespaceContext.put("ns", "urn:iso:std:iso:20022:tech:xsd:camt.054.001.04"); // Select the first GrpHdr element in document order Element element = (Element) select("//ns:GrpHdr[1]", doc, namespaceContext); System.out.println(element.asXML()); // Select the text content of the MsgId element Text msgId = (Text) select("./ns:MsgId/text()", element, namespaceContext); System.out.println(msgId.getText()); } static Object select(String expression, Branch contextNode, Map namespaceContext) { XPath xp = contextNode.createXPath(expression); xp.setNamespaceURIs(namespaceContext); return xp.evaluate(contextNode); } 

请注意,XPath表达式必须使用映射到输入文档中使用的名称空间URI的名称空间前缀,但前缀的实际值无关紧要。