0

因此,我正在使用 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,那么我怎么能让这个东西有效。

谢谢你的帮助!!

4

1 回答 1

0

1) 我的输出是否因为缺少 DTD 而无效?

简短的回答:理论上,也许是,也许不是;在实践中,是的。

在 XML 规范中,有效性是这样定义的:

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

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

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

在实践中,除非您告诉验证解析器在哪里找到要验证的 DTD,否则解析器别无选择,只能采用第二种更具限制性的视图。如果找不到 DTD,它如何验证文档?(一些验证解析器接受指向 DTD 的运行时参数,而另一些则不接受。)

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

从StAX 参考实现的 JavaDocs中,它看起来好像writeDTD(string)是您的朋友。

2)如果它不是DTD,那么我怎么能让这个东西有效。

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

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

于 2014-12-08T16:16:24.297 回答