gpt4 book ai didi

java - SAXParser 无法正确读取 org.w3c.dom.Document 到 java.io.InputStream 的转换

转载 作者:太空宇宙 更新时间:2023-11-04 06:27:27 25 4
gpt4 key购买 nike

我使用以下代码通过 javax.xml.parsers.SAXParser 解析 org.w3c.dom.Document

try
{
// --- Prepare our SAX parser ---
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(true);
SAXParser parser = factory.newSAXParser();
// parser.parse(xmlFile, xmlValidator); /* Does not validate unsaved changes */

// --- Create a stream form our already parsed xml document ---
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
Source xmlSource = new DOMSource(xmlDocument);
Result outputTarget = new StreamResult(outputStream);
TransformerFactory.newInstance().newTransformer().transform(xmlSource, outputTarget);

// --- Validate the xmlDocument ---
parser.parse(new ByteArrayInputStream(outputStream.toByteArray()), xmlValidator);
}
catch (ParserConfigurationException | SAXException | TransformerException | TransformerFactoryConfigurationError | IOException e)
{
e.printStackTrace();
}

解析文档时,我收到错误消息

第 1 行:文档根元素“MyRootName”必须与 DOCTYPE 根“null”匹配。

如果我只解析 xmlDocument 所基于的 xmlFile,一切都会正常工作。

我已确保 xmlDocument 已初始化且有效,我什至尝试将 xmlDocument.getDocumentElement() 传递到 DOMSource,我还确保它有效且符合我的预期(即具有正确名称的文档的根节点)

为什么 javax.xml.parsers.SAXParser 读取 java.io.InputStream 的方式与从文件系统读取“xmlFile”的方式不同?

编辑

相关问题(我已经尝试了所有这些解决方案均无济于事): how to create an InputStream from a Document or Node

我已经找到原因了,详细说明如下: Parsing xml with DOM, DOCTYPE gets erased

最佳答案

所以问题不在于 parser ,它是 Transformer这是剥离 <!DOCTYPE ...> XML 中的行。要解决此问题,只需设置一个转换器属性,使其包含 DTD 文件。

    // --- Create a transformer and transform our Document into an InputStream ---
Transformer transformer = TransformerFactory.newInstance().newTransformer();
// By default the transformer strips out the DOCTYPE tag so we must re-add our DTD file declaration
transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, xmlFile.getParent() + "\\" + xmlDocument.getDoctype().getSystemId());
transformer.transform(xmlSource, outputTarget);

如果您只是传入 DTD 文件名,解析器将在程序启动的位置搜索它,建议指定 DTD 文件的直接路径,如我上面所述。

关于java - SAXParser 无法正确读取 org.w3c.dom.Document 到 java.io.InputStream 的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26607121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com