java - 使用StAX读取同名子节点

标签 java xml-parsing duplicates stax xliff

在尝试使用 StAX 读取 XML 文件时,我遇到了这个问题。

XML 文件(本质上是一个 XLIFF 文件)中,我有同名的子节点。 我不太清楚如何读取这些重复的节点。

下面是我正在尝试的代码部分,以及 XLIFF 文件的示例

这只是代码的工作部分。

Java 代码:

   // Initialize ArrayList to return
    ArrayList<SourceCollection> xmlData = new ArrayList<>();
    boolean isSource = false;
    boolean isTrans = false;
    boolean isContext = false;
    // Setting Up Data Class
    SourceCollection srcData = null;
   // Start StAX XLIFF reader
    XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
    try {
        XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(inStream);
        int event = xmlStreamReader.getEventType();
        while (true) {
            switch (event) {
                case XMLStreamConstants.START_ELEMENT:                            
                    switch (xmlStreamReader.getLocalName()) {
                        case "group":
                            // Create SourceCollection Object
                            srcData = new SourceCollection();
                            srcData.setID(xmlStreamReader.getAttributeValue(0));
                            break;
                        case "source":
                            isSource = true;
                            break;
                        case "target":
                            isTarget = true;
                            break;
                        case "context":
                            isContext = true;
                            break;
                        default:
                            isSource = false;
                            isTarget = false;
                            isContext = false;
                            break;
                    }
                    break;
                case XMLStreamConstants.CHARACTERS:
                    if (srcData != null) {
                        String srcTrns = xmlStreamReader.getText();
                        if (!Utility.isStringNullOrEmptyOrWhiteSpace(srcTrns)) {
                            if (isSource) {
                                srcData.setSource(srcTrns);
                                isSource = false;
                            } else if (isTarget) {
                                srcData.setTarget(srcTrns);
                                isTarget = false;
                            }
                        }
                    }
                    break;
                case XMLStreamConstants.END_ELEMENT:
                    if (xmlStreamReader.getLocalName().equals("group")) {
                        xmlData.add(srcData);
                    }
                    break;
            }
            if (!xmlStreamReader.hasNext()) {
                break;
            }
            event = xmlStreamReader.next();
        }
    } catch (XMLStreamException ex) {
        LOG.log(Level.WARNING, ex.getMessage(), MessageFormat.format("{0} {1}", ex.getCause(), ex.getLocation()));
    }

XLIFF 文件示例:

<XLIFF>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <file datatype="xml">
    <body>
      <group id="25032014">
        <context-group>
          <context context-type="sub1">xxxx</context>
          <context context-type="sub2">yyyy</context>
          <context context-type="sub3"/>
        </context-group>
        <target-unit>
          <source>ABC</source>
          <target>ABC</target>
        </target-unit>
      </group>
    </body>
  </file>
</xliff>
</XLIFF>

当然,这是修改后的XLIFF文件,但结构与原始文件完全相同。

任何示例或建议都会有帮助。

最佳答案

但是您已经处理了这些重复项。我修改了你的代码有点像

        switch (event) {
            case XMLStreamConstants.START_ELEMENT:   
                System.out.println(xmlStreamReader.getLocalName());
                switch (xmlStreamReader.getLocalName()) { 

并且 System.out 提供:

XLIFF
xliff
file
body
group
context-group
context
context
context
target-unit
source
target

您会看到多个上下文输出。现在您必须调整数据结构以保存上下文元素列表,而不仅仅是一个。

关于java - 使用StAX读取同名子节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22647709/

相关文章:

url - 我可以在 SEO 站点地图中包含规范 URL 吗?

sql - MySQL 多重连接/子查询问题

java - Kotlin 数据类 equals() 方法是否可以在不进一步修改的情况下与 JPA 一起使用?

java - 如何获取我的应用程序在azure中运行的虚拟机名称

Android:如何在 SAX 解析器中解析相同的标签?

android - 如何使用kso​​ap2在android中使用xml数据从字符串变量中获取值

Linux:从txt列表中检查重复项

java - 使用 pallet 将 java maven 项目部署到 ec2?

java - 模拟注销会引发错误

java - 如何从 xml java 中搜索并删除某些值