1

我在 Gradle 脚本中有以下代码片段(语法是 Groovy/Java 的组合):

File file = new File(filename) // Filename is being read from console
def content = file.getText()
Document document = DOMBuilder.parse(new StringReader(content), false, false)

问题是,我正在尝试解析 XML 文件,但带有xconf扩展名(例如file.xconf)。出于某种原因,当我尝试上面的代码时,我收到以下错误消息(在控制台中):

java.io.FileNotFoundException: <full_path>/file.dtd (No such file or directory)

路径是正确的,但我注意到扩展名突然更改为.dtd. 我注意到文件中有对该文件版本的引用.dtd,但我希望解析器忽略它(并停止验证,这就是为什么第二个参数 DOMBuilder.parse()为假的原因)。我可以更改此行为以成功解析文件吗?

注意:如果可能的话,我也希望能够对(任何)其他文件扩展名做同样的事情。

提前致谢!

4

3 回答 3

1

file.xconf xml 必须在 XML 中定义 DTD 引用。打开文件并检查。

默认情况下,DOM 解析器根据与 XML 关联的 DTD 验证 XML。如果您不想验证,请将验证模式设置为 false。检查 DomBuilder API。

其他选项是在 XML 中定义 DTD 路径,以便可以从任何地方访问它,或者您也可以注册解析器。我忘了怎么做,但你可以查一下。

于 2013-04-25T08:34:17.300 回答
1

尝试这个:

import groovy.xml.*
import org.w3c.dom.Document;
import org.xml.sax.InputSource;

Document parseWithoutDTD( Reader r, boolean validating=false, boolean namespaceAware=true ) {
  FactorySupport.createDocumentBuilderFactory().with { f ->
    f.namespaceAware = namespaceAware
    f.validating = validating
    f.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
    f.newDocumentBuilder().with { db ->
      db.parse( new InputSource( r ) )
    }
  }
}

Document d = new File( filename ).withReader { r ->
  parseWithoutDTD( r )
}
于 2013-04-25T08:56:37.243 回答
0

DTD定义了 XML 文档的规则。如果您遵循这些规则,则 xml 文档被视为“有效”。如果您想忽略 DTD 文件(例如因为它不存在),请将解析的验证模式设置为 false。

于 2013-04-25T08:38:15.740 回答