Удалите объект, содержащий Doctype из XML, используя Java - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь обработать xml, перед этим мне нужно удалить объявление doctype и entity из входного xml.

Я использую приведенный ниже код для удаления типа документа и сущности:

fileContent = fileContent.replaceAll("<!ENTITY ((.|\n|\r)*?)\">", "");
fileContent = fileContent.replaceAll("<!DOCTYPE((.|\n|\r)*?)>", "");

Это удаляет сущность и затем тип документа. Это прекрасно работает, если xml содержит ниже объявления doctype в xml:

<!DOCTYPE ichicsr SYSTEM "http://www.w3.org/TR/html4/frameset.dtd">

<!DOCTYPE ichicsr SYSTEM "D:\UPGRADE\NTServices\Server\\Xml21.dtd"
[<!ENTITY % entitydoc SYSTEM "D:\UPGRADE\NTServices\Server\\latin-entities.dtd"> %entitydoc;]>

Но если у меня есть тип документа, как указано ниже, он не будет работать, и корневой тег в xml будет удален:

<!DOCTYPE ichicsr SYSTEM "D:\UPGRADE\NTServices\Server\\Xml21.dtd" 
[<!ENTITY % entitydoc SYSTEM 'D:\UPGRADE\NTServices\Server\\Xml21.dtd'>
]> 

Пожалуйста, дайте мне знать, если регулярное выражение, которое я использую, является неправильным или необходимо предпринять какие-либо другие действия.

1 Ответ

0 голосов
/ 16 ноября 2018

Ваш подход не работает, потому что вам необходимо " до финального > в регулярном выражении ENTITIY. Вы можете просто заменить \" на ['\"] там.

Кроме того, никогда не используйте (.|\n|\r)*? в регулярных выражениях, так как это убийца производительности. Вместо этого используйте .*? с Pattern.DOTALL (или встроенный вариант (?s)) или, по крайней мере, [\s\S]*?.

Однако есть лучший способ: объединить два регулярных выражения в один:

fileContent = fileContent.replaceAll("(?i)<!DOCTYPE[^<>]*(?:<!ENTITY[^<>]*>[^<>]*)?>", "");

См. Демоверсию regex .

подробности

  • (?i) - без учета регистра Pattern.CASE_INSENSITIVE встроенный модификатор
  • <!DOCTYPE - буквальный текст
  • [^<>]* - 0+ символов кроме < и >
  • (?:<!ENTITY[^<>]*>[^<>]*)? - необязательное вхождение
    • <!ENTITY
    • [^<>]* - 0+ символов кроме < и >
    • > - > char
    • [^<>]* - 0+ символов, кроме < и >
  • > - > char.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...