سؤال

عندما أقوم بتحليل ملف xml الخاص بي (المتغير f) بهذه الطريقة، أحصل على خطأ

C:\Documents and Settings\joe\Desktop\aicpcudev\OnlineModule\map.dtd (يتعذر على النظام العثور على المسار المحدد)

أعلم أنني لا أملك dtd ولا أحتاج إليه.كيف يمكنني تحليل كائن الملف هذا إلى كائن مستند مع تجاهل أخطاء مرجع DTD؟

private static Document getDoc(File f, String docId) throws Exception{
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document doc = db.parse(f);


    return doc;
}
هل كانت مفيدة؟

المحلول

ونهج مماثل لتلك التي اقترحتها anjanb

    builder.setEntityResolver(new EntityResolver() {
        @Override
        public InputSource resolveEntity(String publicId, String systemId)
                throws SAXException, IOException {
            if (systemId.contains("foo.dtd")) {
                return new InputSource(new StringReader(""));
            } else {
                return null;
            }
        }
    });

ولقد وجدت أن مجرد العودة إلى InputSource فارغة عملت فقط كذلك؟

نصائح أخرى

وحاول تحديد الميزات على DocumentBuilderFactory:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

dbf.setValidating(false);
dbf.setNamespaceAware(true);
dbf.setFeature("http://xml.org/sax/features/namespaces", false);
dbf.setFeature("http://xml.org/sax/features/validation", false);
dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false);
dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);

DocumentBuilder db = dbf.newDocumentBuilder();
...

وأخيرا، أعتقد أن الخيارات هي محددة لتنفيذ محلل. href="http://xerces.apache.org/xerces2-j/features.html" هنا بعض الوثائق لXerces2 اذا كان ذلك يساعد.

ولقد وجدت مشكلة حيث كان ملف DTD في ملف جرة مع XML. I حل القضية على أساس الأمثلة هنا، على النحو التالي: -

DocumentBuilder db = dbf.newDocumentBuilder();
db.setEntityResolver(new EntityResolver() {
    public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
        if (systemId.contains("doc.dtd")) {
             InputStream dtdStream = MyClass.class
                     .getResourceAsStream("/my/package/doc.dtd");
             return new InputSource(dtdStream);
         } else {
             return null;
         }
      }
});
<اقتباس فقرة>   

وأنا أعلم أنني لم يكن لديك اليومي، ولا أنا في حاجة إليها.

وأنا المشبوهة من هذا البيان. لا تحتوي على المستند أية مراجع كيان؟ إذا كان الأمر كذلك، تحتاج بالتأكيد إلى DTD.

وعلى أي حال، فإن الطريقة المعتادة لمنع هذا من الحدوث هو استخدام فهرس XML لتحديد مسار محلي ل "map.dtd".

وهنا مستخدم آخر الذين حصلوا على نفس العدد: HTTP: // المحافل. sun.com/thread.jspa؟threadID=284209&forumID=34

وddssot المستخدم على هذا المنصب يقول

myDocumentBuilder.setEntityResolver(new EntityResolver() {
          public InputSource resolveEntity(java.lang.String publicId, java.lang.String systemId)
                 throws SAXException, java.io.IOException
          {
            if (publicId.equals("--myDTDpublicID--"))
              // this deactivates the open office DTD
              return new InputSource(new ByteArrayInputStream("<?xml version='1.0' encoding='UTF-8'?>".getBytes()));
            else return null;
          }
});

وللمستخدم يذكر قائلا: "كما ترون، عندما محلل يضرب DTD، ويسمى محلل الكيان. إنني أدرك بلدي DTD مع ID محددة وإرجاع ثيقة XML فارغة بدلا من DTD الحقيقي، ووقف كل التحقق من الصحة. .. "

وآمل أن يساعد هذا.

مصدر XML (مع DTD)

<!DOCTYPE MYSERVICE SYSTEM "./MYSERVICE.DTD">
<MYACCSERVICE>
   <REQ_PAYLOAD>
      <ACCOUNT>1234567890</ACCOUNT>
      <BRANCH>001</BRANCH>
      <CURRENCY>USD</CURRENCY>
      <TRANS_REFERENCE>201611100000777</TRANS_REFERENCE>
   </REQ_PAYLOAD>
</MYACCSERVICE>

تنفيذ Java DOM لقبول XML أعلاه كسلسلة وإزالة إعلان DTD

public Document removeDTDFromXML(String payload) throws Exception {

    System.out.println("### Payload received in XMlDTDRemover: " + payload);

    Document doc = null;
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    try {

        dbf.setValidating(false);
        dbf.setNamespaceAware(true);
        dbf.setFeature("http://xml.org/sax/features/namespaces", false);
        dbf.setFeature("http://xml.org/sax/features/validation", false);
        dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false);
        dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);

        DocumentBuilder db = dbf.newDocumentBuilder();

        InputSource is = new InputSource();
        is.setCharacterStream(new StringReader(payload));
        doc = db.parse(is); 

    } catch (ParserConfigurationException e) {
        System.out.println("Parse Error: " + e.getMessage());
        return null;
    } catch (SAXException e) {
        System.out.println("SAX Error: " + e.getMessage());
        return null;
    } catch (IOException e) {
        System.out.println("IO Error: " + e.getMessage());
        return null;
    }
    return doc;

}

الوجهة XML (بدون DTD)

<MYACCSERVICE>
   <REQ_PAYLOAD>
      <ACCOUNT>1234567890</ACCOUNT>
      <BRANCH>001</BRANCH>
      <CURRENCY>USD</CURRENCY>
      <TRANS_REFERENCE>201611100000777</TRANS_REFERENCE>
   </REQ_PAYLOAD>
</MYACCSERVICE> 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top