我有一个如下所示的示例 xml。我有一个要求,我需要交叉引用各种 xml 属性。我已经确定了以下格式,但不确定如何在 java 中解释它。
我如何在java中解释这个xml。例如,如何撤销教师 id="T72100";
的教师详细信息<schedule term="Fall" year="98" xmlns:data="x-schema:idSchema.xml"
xmlns:ref="x-schema:refSchema.xml">
<classes>
<data:class id="ENGL6004">
<title>From Here to Eternity: Studies in the Futureenter code here
and other Temporal Genres</title>
<ref:teacherRef ref="T31330"/>
<students>
<ref:student ref="S50245"/>
<ref:student ref="S87901"/>
<ref:student ref="S19272"/>
<ref:student ref="S48984"/>
</students>
</data:class>
<data:class id="HIST6010">
<title>The You Decade: A History of Finger Pointing
in Post-War America</title>
<ref:teacher ref="T72100"/>
<students>
<ref:student ref="S60912"/>
<ref:student ref="S87901"/>
<ref:student ref="S84281"/>
<ref:student ref="S44098"/>
</students>
</data:class>
<data:class id="ENGL6020">
<title>Reading between the Lines: The Literature
of Waiting</title>
<ref:teacher ref="T31330"/>
<students>
<ref:student ref="S84281"/>
<ref:student ref="S19272"/>
<ref:student ref="S48984"/>
<ref:student ref="S44098"/>
</students>
</data:class>
</classes>
<teachers>
<data:teacher id="T31330">
<name>Margaret Doornan</name>
<position>Associate Professor</position>
<classes>
<ref:class ref="ENGL6004"/>
<ref:class ref="ENGL6020"/>
</classes>
</data:teacher>
<data:teacher id="T72100">
<name>Hal Canter</name>
<position>Instructor</position>
<classes>
<ref:class ref="HIST6010"/>
</classes>
</data:teacher>
</teachers>
<students>
<data:student id="S44098">
<name>Kelly Griftman</name>
<year>Senior</year>
<status>full-time</status>
<classes>
<ref:class ref="HIST6010"/>
<ref:class ref="ENGL6020"/>
</classes>
</data:student>
<data:student id="S48984">
<name>Norbert James</name>
<year>Senior</year>
<status>full-time</status>
<classes>
<ref:class ref="ENGL6004"/>
<ref:class ref="ENGL6020"/>
</classes>
</data:student>
</students>
</schedule>
更新:尝试使用 XPath 来获取所需的输出,但也许我的表达不正确或者我不太了解 Xpath:
String expression = "/schedule/teachers/teacher[@id='T72100']";
Node node = (Node) xPath.compile(expression).evaluate(xmlDocument, XPathConstants.NODE);
if(null != node) {
NodeList nodeList = node.getChildNodes();
for (int i = 0;null!=nodeList && i < nodeList.getLength(); i++) {
Node nod = nodeList.item(i);
if(nod.getNodeType() == Node.ELEMENT_NODE)
System.out.println(nodeList.item(i).getNodeName() + " : " + nod.getFirstChild().getNodeValue());
}
}
输出:
name : Hal Canter
position : Instructor
classes :
这没有提供有关类的信息。我怎样才能检索类(class)的详细信息。 预期输出是
name : Hal Canter
position : Instructor
classes :
id: HIST6010
title: "The You Decade: A History of Finger Pointing in Post-War America"
最佳答案
不幸的是,XPath 不使用文档中定义的命名空间前缀。您需要使用您的前缀来 xpath.setNamespaceContext(...)
,或者使用 a library自动处理所有这些。
这里将老师作为使用 XMLBeam 完成的对象进行读取。读取 Class 元素完全一样。
public class TestXMLParsing {
public interface Schedule {
public interface Teacher {
@XBRead("./classes/ref:class/@ref")
String[] getClassRefs();
@XBRead("./name")
String getName();
@XBRead("./position")
String getPosition();
}
@XBRead("//data:teacher[@id='{0}']")
Teacher getTeacher(String id);
}
@Test
public void readTeacherAndClassesRef() throws IOException {
Schedule schedule = new XBProjector(Flags.TO_STRING_RENDERS_XML).io().url("resource://schedule.xml").read(Schedule.class);
Teacher teacher = schedule.getTeacher("T72100");
System.out.println(teacher.getName()+"\n"+teacher.getPosition()+"\nclasses:");
for (String classRef : teacher.getClassRefs()) {
System.out.println(classRef);
}
}
}
在我看来,这看起来比手动处理 DOM 更直接、更容易理解。
关于java - 如何在java中转换具有 "ref ids"和 "ids"的XML文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26776005/