如何在xml架构层次结构中列出给定级别的元素名称?我在下面的代码列出了层次结构的每个级别的所有元素名称,没有嵌套的概念。
这是我的xml文件:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><?xml-stylesheet type="text/xsl" href="CDA.xsl"?>
<SomeDocument xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:something">
<title>some title</title>
<languageCode code="en-US"/>
<versionNumber value="1"/>
<recordTarget>
<someRole>
<id extension="998991"/>
<addr use="HP">
<streetAddressLine>1357 Amber Drive</streetAddressLine>
<city>Beaverton</city>
<state>OR</state>
<postalCode>97867</postalCode>
<country>US</country>
</addr>
<telecom value="tel:(816)276-6909" use="HP"/>
</someRole>
</recordTarget>
</SomeDocument>
这是我用于导入和迭代xml文件的java方法:
public static void parseFile() {
//get the factory
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
//Using factory get an instance of document builder
DocumentBuilder db = dbf.newDocumentBuilder();
//parse using builder to get DOM representation of the XML file
Document dom = db.parse("D:\\mypath\\somefile.xml");
//get the root element
Element docEle = dom.getDocumentElement();
//get a nodelist of elements
NodeList nl = docEle.getElementsByTagName("*");
if (nl != null && nl.getLength() > 0) {
for (int i = 0; i < nl.getLength(); i++) {
Node node = nl.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
System.out.println("node.getNodeName() is: "+node.getNodeName());
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
上述程序的输出是:
title
languageCode
versionNumber
recordTarget
someRole
id
addr
streetAddressLine
city
state
postalCode
country
telecom
相反,我想输出以下内容:
title
languageCode
versionNumber
recordTarget
然后能够将recordTarget
的子项列为someRole
,然后将someRole
的子项列为id
,{{1 }和addr
。依此类推,但由我自行决定。如何更改代码以获取我想要的输出?
答案 0 :(得分:1)
您正在使用此行获取所有节点:
NodeList nl = docEle.getElementsByTagName("*");
将其更改为
NodeList nl = docEle.getChildNodes();
获得所有孩子。然后,您的print语句将为您提供所需的输出。
然后,当您遍历NodeList时,您可以选择在您创建的每个节点上调用相同的方法:
NodeList children = node.getChildNodes();
如果要打印类似XML的结构,可能正在寻找打印所有子节点的递归方法。
答案 1 :(得分:1)
您可以重新编写parseFile
(我宁愿称之为parseChildrenElementNames
)方法来获取输入String
,该输入指定要打印出来的元素名称子元素名称:
public static void parseChildrenElementNames(String parentElementName) {
// get the factory
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
// Using factory get an instance of document builder
DocumentBuilder db = dbf.newDocumentBuilder();
// parse using builder to get DOM representation of the XML file
Document dom = db
.parse("D:\\mypath\\somefile.xml");
// get the root element
NodeList elementsByTagName = dom.getElementsByTagName(parentElementName);
if(elementsByTagName != null) {
Node parentElement = elementsByTagName.item(0);
// get a nodelist of elements
NodeList nl = parentElement.getChildNodes();
if (nl != null) {
for (int i = 0; i < nl.getLength(); i++) {
Node node = nl.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
System.out.println("node.getNodeName() is: "
+ node.getNodeName());
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
但是,这只会考虑与指定名称匹配的第一个元素。
例如,要获取名为someRole
的第一个节点下的元素列表,您可以调用parseChildrenElementNames("someRole");
来打印出来:
node.getNodeName() is: id
node.getNodeName() is: addr
node.getNodeName() is: telecom