Заставьте DocumentBuilder.parse проигнорировать ссылки DTD

Поскольку я не мог найти клонера, который отвечает всем моим требованиям в разных проектах, я создал глубокий клонер, который можно настроить и адаптировать к различным структурам кода вместо того, чтобы адаптировать мой код для удовлетворения требований клонеров. Это достигается путем добавления аннотаций к коду, который должен быть клонирован, или вы просто оставляете код так, как будто он имеет поведение по умолчанию. Он использует отражение, тип кэша и основан на quickflect . Процесс клонирования очень быстрый для огромного количества данных и высокой иерархии объектов (по сравнению с другими алгоритмами, основанными на отражении / сериализации).

https://github.com/kalisohn/CloneBehave

Также доступен в виде пакета nuget: https: //www.nuget. org / packages / Clone.Behave / 1.0.0

Например: Следующий код содержит адрес deepClone, но выполняет только мелкую копию поля _currentJob.

public class Person 
{
  [DeepClone(DeepCloneBehavior.Shallow)]
  private Job _currentJob;      

  public string Name { get; set; }

  public Job CurrentJob 
  { 
    get{ return _currentJob; }
    set{ _currentJob = value; }
  }

  public Person Manager { get; set; }
}

public class Address 
{      
  public Person PersonLivingHere { get; set; }
}

Address adr = new Address();
adr.PersonLivingHere = new Person("John");
adr.PersonLivingHere.BestFriend = new Person("James");
adr.PersonLivingHere.CurrentJob = new Job("Programmer");

Address adrClone = adr.Clone();

//RESULT
adr.PersonLivingHere == adrClone.PersonLivingHere //false
adr.PersonLivingHere.Manager == adrClone.PersonLivingHere.Manager //false
adr.PersonLivingHere.CurrentJob == adrClone.PersonLivingHere.CurrentJob //true
adr.PersonLivingHere.CurrentJob.AnyProperty == adrClone.PersonLivingHere.CurrentJob.AnyProperty //true

76
задан sblundy 20 February 2009 в 14:43
поделиться

4 ответа

Аналогичный подход к тому, предложенному @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 работал точно также?

57
ответ дан Community 24 November 2019 в 10:49
поделиться

Попытайтесь установить функции на 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();
...

В конечном счете, я думаю, что опции характерны для реализации синтаксического анализатора. Вот некоторая документация для Xerces2, если это помогает.

128
ответ дан jt. 24 November 2019 в 10:49
поделиться

вот другой пользователь, который получил ту же проблему: http://forums.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 с его определенным идентификатором и возвращаю пустой документ XML вместо реального DTD, останавливая всю проверку..."

Hope это помогает.

2
ответ дан anjanb 24 November 2019 в 10:49
поделиться

я знаю, что у меня нет даты, и при этом мне не нужна она.

я с подозрением отношусь к этому оператору; Ваш документ содержит какие-либо ссылки на сущность? Если так, Вам определенно нужен DTD.

Так или иначе, обычный способ предотвратить это использует каталог XML для определения локального пути для "map.dtd".

2
ответ дан Edward Z. Yang 24 November 2019 в 10:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: