繁体   English   中英

使用StAX从一个XML文档读取DTD并写入另一个

[英]Use StAX to read DTD from one XML doc and write to another

因此,我正在使用StAX对一系列XML文档进行数据清理。 我想本质上读文档并吐出完全相同的文档,但缺少一些标签。 我遇到的问题是我没有输出有效的XML。

您可以在左侧看到我的输出,在[这里]右侧看到原始文档( http://imgur.com/a/oFxZd )。 底部的图像也是xmllint -valid的输出。 正如您所看到的,没有找到DTD,并且在文档末尾还有其他内容。

我实现作家的代码是这样

public XMLEventWriter setUpWriter(File blah) throws FileNotFoundException,                XMLStreamException {
    newFileName = thef.getName().substring(0, thef.getName().indexOf("_") + 1);

    try {
        writer = outputFactory
                .createXMLEventWriter(new FileOutputStream(newFileName + "mush.xml"), "UTF-8");

    } catch (XMLStreamException ex) {
        ex.printStackTrace();
        System.out.println("There was an XML Stream Exception, whatever that means for writer");
    }
    //outputFactory.setProperty("escapeCharacters", false);
    eventFactory = XMLEventFactory.newInstance();
    StartDocument startDocument = eventFactory.createStartDocument();

    writer.add(startDocument);
    //writer.add("<!DOCTYPE DjVuXML>");
    return writer;
}

这是我处理实际写作的代码。

 if (event.isStartElement()) { //first it looks for start elements
            StartElement se = event.asStartElement();
            if ("OBJECT".equals(se.getName().getLocalPart())) {
                writer.add(se);
            } else if ("MAP".equals(se.getName().getLocalPart())) {
                writer.add(se);
    } else if ("PARAM".equals(se.getName().getLocalPart())) {
                writer.add(se);
            } else if ("LINE".equals(se.getName().getLocalPart())) {
                writer.add(se);
            } else if ("DjVuXML".equals(se.getName().getLocalPart())) {
                writer.add(se);
            }else if ("WORD".equals(se.getName().getLocalPart())) {
                    word.text = reader.getElementText();

                    EndElement wordEnd = eventFactory.createEndElement("", "", "WORD");
                    writer.add(se);
                    Characters characters = eventFactory.createCharacters(word.text);
                    writer.add(characters);
                    writer.add(wordEnd);
                }

            }

        } else if (event.isEndElement()) {

            EndElement ee = event.asEndElement();
            if ("MAP".equals(ee.getName().getLocalPart())) {
                writer.add(ee);

            } else if ("DjVuXML".equals(ee.getName().getLocalPart())) {
                writer.add(ee);
            } else if ("LINE".equals(ee.getName().getLocalPart())) {
                writer.add(ee);
            }
            else if ("BODY".equals(ee.getName().getLocalPart())) {
                writer.add(ee);
            }
        }

    }
    writer.flush();
    writer.close();

现在我们已经解决了这个问题,我的问题是双重的:

1)由于缺少DTD,我的输出是否无效?

1a)如果是,我如何包括DTD? 即使不告诉我,这一直困扰着我

2)如果它不是DTD,那么我该怎么做才有效。

谢谢你的帮助!!

1)由于缺少DTD,我的输出是否无效?

简短的回答:从理论上讲,也许是,也许不是。 实际上,是的。

在XML规范中,有效性定义如下:

如果XML文档具有关联的文档类型声明,并且该文档符合其中表示的约束,则该XML文档是有效的。

一些读者认为,这意味着并且仅当该文件遵守DTD中的约束条件时,该文件才对DTD有效。 从这种意义上说,没有文档类型声明的文档可以对某些指定的DTD有效,而具有文档类型声明的文档可以对文档类型声明中指定的DTD或任何其他指定的DTD有效。 还是无效(视情况而定)。

其他读者认为此定义意味着,除非具有文档类型声明,否则文档是无效的(至少在严格意义上来说),并且有效性问题仅对文档的文档定义的文档类型定义有意义。文档类型声明。

实际上,除非您告诉验证解析器在哪里可以找到要验证的DTD,否则解析器别无选择,只能采取第二种限制性更强的视图。 如果找不到DTD,如何验证文档? (某些验证解析器接受用于指向DTD的运行时参数,其他则不接受。)

1a)如果是,我如何包括DTD? 即使不告诉我,这一直困扰着我

从用于StAX参考实现的JavaDocs中,似乎writeDTD(string)是您的朋友。

2)如果它不是DTD,那么我该怎么做才有效。

如果您收到有关“外部内容”的消息,则您的输出似乎不仅无效而且格式不正确。 首先检查并修复。

出现“额外内容”错误消息的可能原因是您过早关闭了根元素,或者根本没有根元素。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM