Java의 XPath에서 런타임에서 DTD를 비활성화하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/243728

  •  04-07-2019
  •  | 
  •  

문제

파일에 dtd를 얻었고 제거 할 수 없습니다. Java로 구문 분석하려고 할 때 "java.net.socketexception : 네트워크가 연결할 수 없다 : Connect". 어떻게 든 DTD 확인을 비활성화 할 수 있습니까?

도움이 되었습니까?

해결책

자신의 EntityResolver를 지정하거나 파서의 특정 기능을 사용할 수 있습니까? 보다 여기 일부 접근 방식.

보다 완전한 예 :

<?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);
    }
}

도움이 되었기를 바랍니다...

다른 팁

이것은 나를 위해 효과가있었습니다.

 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();
  }

나는 전에이 문제가 있었다. DTD의 로컬 사본을 다운로드하고 저장 한 다음 로컬 사본에 대해 검증하여 해결했습니다. 로컬 사본을 가리려면 XML 파일을 편집해야합니다.

<!DOCTYPE root-element SYSTEM "filename">

더 많은 정보는 다음과 같습니다. http://www.w3schools.com/dtd/dtd_intro.asp

나는 당신이 파서에서 일종의 ValidateOnParse 속성을 수동으로 "false"로 설정할 수 있다고 생각합니다. XML을 구문 분석하는 데 사용하는 라이브러리에 따라 다릅니다.

추가 정보는 여기에 있습니다 : http://www.w3schools.com/dtd/dtd_validation.asp

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top