java - 如何在java中转换具有 "ref ids"和 "ids"的XML文件

标签 java xml

我有一个如下所示的示例 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/

相关文章:

java - 有效的 JUnit 测试

android - 进度对话框 - AsyncTask

xml - 无法阻止 PowerShell 更改返回对象的类型

Java Graphics,使用点击事件改变绘图的颜色

java - 静态变量初始化的区别

java - 简单的命中计数器 Servlet 需要用于重置功能的 URL 映射

android 自动生成带.out 的xml 文件

c# - 使用 html 敏捷包从 c# 中的 html 中提取图像 url 并将它们写入 xml 文件

java - 在java eclipse中读取文本文件作为二维数组错误

java - JPA 标准规范 - 使用 group by 进行多选返回所有列