我得到了dtd文件,我不能刪除它。當我嘗試在Java中解析它時,我得到了「由java.net.SocketException:網絡無法訪問:連接引起的」,因爲它的遠程dtd。我可以禁用某種方式dtd檢查?如何在運行時在java的xpath中禁用dtd?
13
A
回答
18
你應該能夠指定你自己的EntityResolver,或者使用你的解析器的特定功能?有些方法請參見here。
一個更完整的例子:
<?xml version="1.0"?>
<!DOCTYPE foo PUBLIC "//FOO//" "foo.dtd">
<foo>
<bar>Value</bar>
</foo>
和XPath用法:
import java.io.File;
import java.io.IOException;
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
public class Main {
public static void main(String[] args) throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
builder.setEntityResolver(new EntityResolver() {
@Override
public InputSource resolveEntity(String publicId, String systemId)
throws SAXException, IOException {
System.out.println("Ignoring " + publicId + ", " + systemId);
return new InputSource(new StringReader(""));
}
});
Document document = builder.parse(new File("src/foo.xml"));
XPathFactory xpathFactory = XPathFactory.newInstance();
XPath xpath = xpathFactory.newXPath();
String content = xpath.evaluate("/foo/bar/text()", document
.getDocumentElement());
System.out.println(content);
}
}
希望這有助於...
2
我以前有這個問題。我通過下載和存儲DTD的本地副本,然後根據本地副本進行驗證來解決此問題。您需要編輯XML文件以指向本地副本。
<!DOCTYPE root-element SYSTEM "filename">
多一點的信息在這裏:http://www.w3schools.com/dtd/dtd_intro.asp
我想你也可以手動設置某種validateOnParse屬性設置爲「假」在你的解析器。取決於你用來解析XML的庫。
13
這爲我工作:
SAXParserFactory saxfac = SAXParserFactory.newInstance();
saxfac.setValidating(false);
try {
saxfac.setFeature("http://xml.org/sax/features/validation", false);
saxfac.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false);
saxfac.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
saxfac.setFeature("http://xml.org/sax/features/external-general-entities", false);
saxfac.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
}
catch (Exception e1) {
e1.printStackTrace();
}
+3
+1的因素做 - 這是這裏最好的答案 - 但是僅僅使用這一行就足夠了:``saxfac.setFeature(「http://apache.org/xml/features/nonvalidating/load-external-dtd」,false);``` – 2010-10-23 09:17:51
相關問題
- 1. 如何在運行時禁用陰影?
- 2. Java:如何在使用Java處理XML文檔時使用DTD?
- 3. 如何禁用運行在Rails3中
- 4. 如何在QT中運行XPath查詢?
- 5. 如何防止XML :: XPath在處理XML文件時獲取DTD?
- 6. 如何在運行或啓動時在Spring中禁用服務?
- 7. 在CefSharp中,如何在程序運行時禁用代理
- 8. XML DTD - XPATH 1.0
- 9. 如何在Java中運行
- 10. 的Java:我如何在運行時
- 11. 暫時在setInterval運行時禁用DIV
- 12. 如何使運行的活動,同時禁止進度條在Java中的Android
- 13. 如何使用JAXB2.0禁用DTD提取
- 14. 在運行時禁用models.URLField上的verify_exists?
- 15. 如何在java中調用xpath deep-equal
- 16. 啓用/禁用輕掃在運行時
- 17. 在運行時啓用和禁用gprof?
- 18. 如何在運行時/啓動時禁用System.setOut和setErr?
- 19. 如何在運行時臨時禁用捆綁和縮小?
- 20. 在Java中解析XML文件時如何避免讀取DTD?
- 21. 禁用運行時
- 22. 如何從Docker運行時禁用TLS?
- 23. 如何禁用SystemC運行時警告?
- 24. 如何在運行時禁用Crystal Report的分組?
- 25. 如何在運行ruby mine時禁用firefox的parent.lock文件
- 26. 如何在運行時禁用AlertDialog的正向按鈕?
- 27. 如何在運行時禁用Couchbase連接失敗的緩存?
- 28. Java如何在運行時鏈接庫
- 29. 如何在應用程序運行時禁用手機鍵盤?
- 30. 如何在運行時啓用/禁用縮放?
謝謝,這減少了一些單元測試我被7 – 2008-11-13 17:38:41