2012-01-12 5 views
4

Я хотел бы работать с SAXReader offline, проблема в том, что SAXReader проверяет соответствие xml DTD. Я не хочу менять DTD или что-то еще в XML. От поиска на этом сайте и других источниках я нашел 2 ответов, которые не мне помочь:Как использовать dom4j SAXReader в автономном режиме?

  1. использовать EntityResolver для обхода сетевого вызова
  2. использование setIncludeExternalDTDDeclarations (ложного)

Примера того, что Я пытался сделать:

protected Document getPlistDocument() throws MalformedURLException, 
DocumentException { 
    SAXReader saxReader = new SAXReader(); 
    saxReader.setIgnoreComments(false); 
    saxReader.setIncludeExternalDTDDeclarations(false); 
    saxReader.setIncludeInternalDTDDeclarations(true); 
    saxReader.setEntityResolver(new MyResolver()); 
    Document plistDocument = saxReader.read(getDestinationFile().toURI().toURL()); 
    return plistDocument; 
} 

public class MyResolver implements EntityResolver { 
    public InputSource resolveEntity (String publicId, String systemId) 
    { 
     if (systemId.equals("http://www.myhost.com/today")) { 
      // if we want a custom implementation, return a special input source 
      return null; 

     } else { 
      // use the default behaviour 
      return null; 
     } 
    } 
} 

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 

Я до сих пор не в состоянии работать в автономном режиме, пожалуйста, советы ... спасибо

StackTrace:

14:20:44,358 ERROR [ApplicationBuilder] iphone build failed: Resource Manager - Problem handle Root.plist: www.apple.com Nested exception: www.apple.com 
com.something.builder.sourcemanager.exception.SourceHandlingException: Resource Manager - Problem handle Root.plist: www.apple.com Nested exception: www.apple.com 
**** 
**** 
Caused by: org.dom4j.DocumentException: www.apple.com Nested exception: www.apple.com 
at org.dom4j.io.SAXReader.read(SAXReader.java:484) 
at org.dom4j.io.SAXReader.read(SAXReader.java:291) 
... 10 more 
+0

Какая ошибка вы находите? Вызывает ли это какое-либо исключение? Не могли бы вы отправить сообщение и трассировку стека такого исключения? –

ответ

5

Ваше предприятие распознаватель ничего не обрабатывает (так как она всегда возвращает нуль). Заставьте его возвращать InputSource в фактический DTD-файл, когда системный ID равен http://www.apple.com/DTDs/PropertyList-1.0.dtd, так как это DTD, который пытается загрузить dom4j.

public class MyResolver implements EntityResolver { 
    public InputSource resolveEntity (String publicId, String systemId) 
    { 
     if (systemId.equals("http://www.apple.com/DTDs/PropertyList-1.0.dtd")) { 
      return new InputSource(MyResolver.class.getResourceAsStream("/dtds/PropertyList-1.0.dtd"); 
     } else { 
      // use the default behaviour 
      return null; 
     } 
    } 
} 

Эта реализация, например, возвращает DTD из (в пути к классам пакета dtds). Вам просто нужно загрузить DTD самостоятельно и связать его в своем приложении, в пакете dtds.

0

Обратите внимание, что вы фактически не проверяете DTD. Для этого вам необходимо:

SAXReader saxReader = new SAXReader(true); 

В противном случае JB направо - он зашел за 3 минуты передо мной!

0

В качестве опции, если вы хотите просто использовать SAXReader в автономном режиме, отключите его внешний выбор DTD с помощью функции http://apache.org/xml/features/nonvalidating/load-external-dtd Xerces .

Согласно Xerces features documentation, установка этого значения false делает SAXReader полностью игнорирующим внешний DTD.

This SO answer имеет пример кода.

Смежные вопросы