使用javadom解析器解析xml
我不熟悉Java和XML,需要从XML文件中获取一些数据 这是我的xml使用javadom解析器解析xml,java,xml,Java,Xml,我不熟悉Java和XML,需要从XML文件中获取一些数据 这是我的xml <?xml version="1.0" encoding="UTF-8"?> <course name="BSc (Hons) Software Engineering" version="5.0" type="FT" lowerbound="2012" upperbound="2014" > <year id="1"> <semester id="1">
<?xml version="1.0" encoding="UTF-8"?>
<course name="BSc (Hons) Software Engineering" version="5.0" type="FT" lowerbound="2012" upperbound="2014" >
<year id="1">
<semester id="1">
<module>
<code>HCA1105C</code>
<name>Computer Architecture</name>
<credits>4</credits>
<hrs_per_wk>2+2</hrs_per_wk>
</module>
<module>
<code>PROG1115C</code>
<name>Object Oriented Software Development I</name>
<credits>4</credits>
<hrs_per_wk>2+2</hrs_per_wk>
</module>
<module>
<code>MATH1103C</code>
<name>Decision Mathematics</name>
<credits>3</credits>
<hrs_per_wk>2+1</hrs_per_wk>
</module>
<module>
<code>ITE1107C</code>
<name>Language and Communication Seminar</name>
<credits>3</credits>
<hrs_per_wk>2+1</hrs_per_wk>
</module>
<module>
<code>MGMT1101C</code>
<name>Management Seminar</name>
<credits>3</credits>
<hrs_per_wk>2+1</hrs_per_wk>
</module>
</semester>
<semester id="2">
<module>
<code>PROG1116C</code>
<name>Object Oriented Software Development II</name>
<credits>4</credits>
<hrs_per_wk>2+2</hrs_per_wk>
</module>
<module>
<code>WAT1116C</code>
<name>Internet Programming I</name>
<credits>4</credits>
<hrs_per_wk>2+2</hrs_per_wk>
</module>
<module>
<code>MATH1101C</code>
<name>Analytic Methods for Computing</name>
<credits>4</credits>
<hrs_per_wk>2+2</hrs_per_wk>
</module>
<module>
<code>DBT1111C</code>
<name>Database Design</name>
<credits>4</credits>
<hrs_per_wk>2+2</hrs_per_wk>
</module>
</semester>
</year>
<year id="2">
<semester id="1">
<module>
<code>CAN2112C</code>
<name>Network Design & Programming</name>
<credits>4</credits>
<hrs_per_wk>2+2</hrs_per_wk>
</module>
<module>
<code>WAT2117C</code>
<name>Internet Programming II</name>
<credits>4</credits>
<hrs_per_wk>2+2</hrs_per_wk>
</module>
<module>
<code>OSS2109C</code>
<name>Operating Systems</name>
<credits>4</credits>
<hrs_per_wk>2+2</hrs_per_wk>
</module>
<module>
<code>PROG2117C</code>
<name>Desktop Application Development</name>
<credits>4</credits>
<hrs_per_wk>2+2</hrs_per_wk>
</module>
</semester>
<semester id="2">
<module>
<code>SDT2114C</code>
<name>Requirements Engineering</name>
<credits>4</credits>
<hrs_per_wk>2+2</hrs_per_wk>
</module>
<module>
<code>MATH2323C</code>
<name>Numerical Methods</name>
<credits>4</credits>
<hrs_per_wk>2+2</hrs_per_wk>
</module>
<module>
<code>MCT2104C</code>
<name>Mobile Application Development</name>
<credits>4</credits>
<hrs_per_wk>2+2</hrs_per_wk>
</module>
<module>
<code>MCT2104C</code>
<name>Mobile Application Development</name>
<credits>4</credits>
<hrs_per_wk>2+2</hrs_per_wk>
</module>
<module>
<code>WAT2124C</code>
<name>Web Services</name>
<credits>4</credits>
<hrs_per_wk>2+2</hrs_per_wk>
</module>
<module>
<code>MGMT2104C</code>
<name>Research & Development Seminar</name>
<credits>3</credits>
<hrs_per_wk>2+1</hrs_per_wk>
</module>
</semester>
</year>
<year id="3">
<semester id="1">
<module>
<code>SECU3119C</code>
<name>Secure Software Development</name>
<credits>4</credits>
<hrs_per_wk>2+2</hrs_per_wk>
</module>
<module>
<code>MULT3114C</code>
<name>Game Development</name>
<credits>4</credits>
<hrs_per_wk>2+2</hrs_per_wk>
</module>
<module>
<code>SEM3112C</code>
<name>Project Management Seminar</name>
<credits>3</credits>
<hrs_per_wk>2+1</hrs_per_wk>
</module>
</semester>
<semester id="2">
<module>
<code>SDT3104C</code>
<name>Enterprise Software Development</name>
<credits>4</credits>
<hrs_per_wk>2+2</hrs_per_wk>
</module>
<module>
<code>WAT3125C</code>
<name>Emerging Web Technologies</name>
<credits>4</credits>
<hrs_per_wk>2+2</hrs_per_wk>
</module>
<module>
<code>SEM3113C</code>
<name>Software Quality Management</name>
<credits>4</credits>
<hrs_per_wk>2+2</hrs_per_wk>
</module>
<module>
<code>MGMT3105C</code>
<name>Entrepreneurship Seminar</name>
<credits>3</credits>
<hrs_per_wk>2+1</hrs_per_wk>
</module>
<module>
<code>PROJ3105C</code>
<name>Systems Development Project</name>
<credits>9</credits>
<hrs_per_wk />
</module>
</semester>
</year>
</course>
假设我想得到第一学期第一年的所有模块代码
HCA1105C
PROG1115C
MATH1103C
ITE1107C
MGMT1101C
这是到目前为止我的代码
try {
File inputFile = new File(System.getProperty("user.dir") + "/courses/bse.xml");
DocumentBuilderFactory dbFactory
= DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(inputFile);
doc.getDocumentElement().normalize();
NodeList nList = doc.getElementsByTagName("year");
for (int i = 0; i < nList.getLength(); i++) {
Node nNode = nList.item(i);
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
//if (Integer.parseInt(eElement.getAttribute("id")) == 1 ) {
System.out.println(eElement.getElementsByTagName("code").item(0).getTextContent());
//}
}
}
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e.getMessage(), "Fatal Error", JOptionPane.ERROR_MESSAGE);
System.exit(1);
}
您的代码正在读取每年的第一个模块。这是因为,对于您指定的标准,节点列表将有3个节点:year=1、year=2、year=3 如果您想阅读第1年的所有模块,那么您需要以year=1递归到文档的子部分。然后你就可以拿到学期结单了。您需要进一步递归到学期=1的孩子 您可以尝试使用带有xpath的查询,在这里您可以直接获得year=1和term=1的模块 使用XPath修改代码进行编辑:
try {
File inputFile = new File("courses.xml");
DocumentBuilderFactory dbFactory
= DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(inputFile);
doc.getDocumentElement().normalize();
XPath xPath = XPathFactory.newInstance().newXPath();
String expression = "/course/year[@id=1]/semester[@id=1]/module/code";
NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(doc, XPathConstants.NODESET);
System.out.println(expression);
for (int i = 0; i < nodeList.getLength(); i++) {
System.out.println(nodeList.item(i).getTextContent());
}
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e.getMessage(), "Fatal Error", JOptionPane.ERROR_MESSAGE);
System.exit(1);
}
检查子节点并深入查看模块将给出如下预期结果
public static void main(String[] args) {
try {
File inputFile = new File("Snippet.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(inputFile);
doc.getDocumentElement().normalize();
NodeList nList = doc.getElementsByTagName("year");
for (int i = 0; i < nList.getLength(); i++) {
Node nNode = nList.item(i);
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
if (Integer.parseInt(eElement.getAttribute("id")) == 1) { // Found year 1
NodeList semeterList = nNode.getChildNodes();
for (int j = 0; j < semeterList.getLength(); j++) {
nNode = semeterList.item(j);
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element semesterNode = (Element) nNode;
if (Integer.parseInt(semesterNode.getAttribute("id")) == 1) { //Found semester 1
NodeList moduleList = semesterNode.getChildNodes();
for (int k = 0; k < moduleList.getLength(); k++) {
nNode = moduleList.item(k);
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element modeluNode = (Element) nNode;
System.out.println(modeluNode.getElementsByTagName("code").item(0).getTextContent());
}
}
}
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
JOptionPane.showMessageDialog(null, e.getMessage(), "Fatal Error", JOptionPane.ERROR_MESSAGE);
System.exit(1);
}
}
我们可以使用以下代码通过DOM获取所有代码:
try {
File inputFile = new File("src/resources/res.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(inputFile);
doc.getDocumentElement().normalize();
NodeList nList = doc.getElementsByTagName("module");
for (int i = 0; i < nList.getLength(); i++) {
Node nNode = nList.item(i);
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
System.out.println(eElement.getElementsByTagName("code").item(0).getTextContent());
}
}
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e.getMessage(), "Fatal Error", JOptionPane.ERROR_MESSAGE);
System.exit(1);
}
我们还可以通过每年->学期->模块循环获取代码,然后获取属性代码。上述代码给出了以下结果:
HCA1105C
PROG1115C
MATH1103C
ITE1107C
MGMT1101C
PROG1116C
瓦特1116C
数学1101C
DBT1111C
CAN2112C
WAT2117C
OSS2109C
PROG2117C
SDT2114C
数学2323C
MCT2104C
MCT2104C
WAT2124C
MGMT2104C
SECU3119C
MULT3114C
SEM3112C
SDT3104C
瓦特3125C
SEM3113C
MGMT3105C
PROJ3105C稍微修改一下,获取模块节点,然后从那里获取代码。取决于您是否需要任何额外信息。但这应该是首选答案。
try {
File inputFile = new File("src/resources/res.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(inputFile);
doc.getDocumentElement().normalize();
NodeList nList = doc.getElementsByTagName("module");
for (int i = 0; i < nList.getLength(); i++) {
Node nNode = nList.item(i);
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
System.out.println(eElement.getElementsByTagName("code").item(0).getTextContent());
}
}
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e.getMessage(), "Fatal Error", JOptionPane.ERROR_MESSAGE);
System.exit(1);
}