问题描述
我正在尝试读取 XML 文件元素的属性,为此我使用了 jdom2 和 Stax 库。
private String readIncludeAll(String filePath) throws JDOMException,IOException,XMLStreamException {
String includeAll = null;
Document document = getStAXParsedDocument(filePath);
Element rootNode = document.getRootElement();
logger.info("ROOT: "+rootNode );
List <Element> children=rootNode.getChildren();
for(int i=0;i<children.size();i++){
logger.info("CHILDREN:" +children.get(i).toString());
}
Element includeElement=rootNode.getChild("includeAll");
logger.info("INCLUDE ELEMENT: "+includeElement);
// includeAll=includeElement.getAttributeValue("path");
//logger.info("VALOR DE PATH: "+includeAll);
return includeAll;
}
private Document getStAXParsedDocument(final String fileName) throws JDOMException,FileNotFoundException,XMLStreamException {
XMLInputFactory factory = XMLInputFactory.newFactory();
XMLEventReader reader = factory.createXMLEventReader(new FileReader(fileName));
StAXEventBuilder builder = new StAXEventBuilder();
return builder.build(reader);
}
我尝试在控制台中打印根元素的子元素,而 includeAll 确实是根元素的子元素。为什么它被返回为 NULL?
ROOT: [Element: <databaseChangeLog [Namespace: http://www.liquibase.org/xml/ns/dbchangelog]/>]
CHILDREN:[Element: <includeAll [Namespace: http://www.liquibase.org/xml/ns/dbchangelog]/>]
INCLUDE ELEMENT: null
解决方法
使用带有本地名称和命名空间 http://www.jdom.org/docs/apidocs/org/jdom2/Element.html#getChild(java.lang.String,%20org.jdom2.Namespace) 的 getChild
重载,即 rootNode.getChild("includeAll",Namespace.get("http://www.liquibase.org/xml/ns/dbchangelog"))