【问题标题】:Parsing xml files with JDK SAX parser with character # in containing folder always fails使用包含文件夹中的字符 # 的 JDK SAX 解析器解析 xml 文件总是失败
【发布时间】:2018-07-03 17:06:01
【问题描述】:

见主题。这是在具有以下路径的文件上执行的(在 Mac OSX 上):

/Volumes/RobExtL/xmltests/hurz#1/hurz.xml

这是一个有效的路径。

该消息表明 JDK 解析器不知何故无法处理文件名中的“#”并切断以它开头的所有内容。

使用 JDOM2 可以毫无问题地解析相同的文件。我在这里不使用 JDOM2 的原因是,这是一个仅使用 SAX 确定根元素名称的实用程序,以避免解析潜在的大文件,在这种情况下,这对性能至关重要。

Stacktrace 应该包含所有剩余的必要信息。

Exception in thread "main" java.io.FileNotFoundException: /Volumes/RobExtL/xmltests/hurz (No such file or directory)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at java.io.FileInputStream.<init>(FileInputStream.java:93)
at sun.net.www.protocol.file.FileURLConnection.connect(FileURLConnection.java:90)
at sun.net.www.protocol.file.FileURLConnection.getInputStream(FileURLConnection.java:188)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:623)
at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:189)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:805)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:770)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1140)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:655)
at de.lesspain.xml.XML.getRootElementName(XML.java:69)
at de.lesspain.xml.XML.hasRootElement(XML.java:80)
at XMLEntityManagerErrorTest.main(XMLEntityManagerErrorTest.java:15)

提前感谢您的任何提示, 最好的

【问题讨论】:

  • 您是如何创建输入源的?在您的问题中添加该代码。

标签: java xml sax jdom-2


【解决方案1】:

# in file 和 dir names 是一个有效的文件系统路径,当然。但它作为 URL 是完全无效的。

在使用 XML API 来指定我们要解析的 XML 文档时,通常会通过其“系统 ID”(它只是其 URI 的另一个名称)来指定。典型用法是使其成为当前目录 URL 的相对 URI,因此很容易被误认为是相对文件路径,因为它们的工作方式相同……但 # 在 URL 中无效。

您应该已经展示了用于尝试解析的代码,所以我们可以确定。奇怪的是你认为你不需要显示代码。

【讨论】:

  • 是的,对不起,我完全错了。我自己发现了这一点,并想将解决方案与一个大大的“我的错,对不起”一起发布。非常感谢您这么快回答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-27
  • 1970-01-01
  • 2013-06-30
  • 2014-06-26
  • 1970-01-01
  • 2011-02-09
  • 1970-01-01
相关资源
最近更新 更多