Поскольку я не мог найти клонера, который отвечает всем моим требованиям в разных проектах, я создал глубокий клонер, который можно настроить и адаптировать к различным структурам кода вместо того, чтобы адаптировать мой код для удовлетворения требований клонеров. Это достигается путем добавления аннотаций к коду, который должен быть клонирован, или вы просто оставляете код так, как будто он имеет поведение по умолчанию. Он использует отражение, тип кэша и основан на 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
Аналогичный подход к тому, предложенному @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();
...
В конечном счете, я думаю, что опции характерны для реализации синтаксического анализатора. Вот некоторая документация для Xerces2, если это помогает.
вот другой пользователь, который получил ту же проблему: 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 это помогает.
я знаю, что у меня нет даты, и при этом мне не нужна она.
я с подозрением отношусь к этому оператору; Ваш документ содержит какие-либо ссылки на сущность? Если так, Вам определенно нужен DTD.
Так или иначе, обычный способ предотвратить это использует каталог XML для определения локального пути для "map.dtd".