Estoy tratando de procesar un xml, antes de que necesito para retirar la declaración DOCTYPE y la entidad desde el XML de entrada.
Estoy utilizando el código de abajo para quitar el tipo de documento y de la entidad:
fileContent = fileContent.replaceAll("<!ENTITY ((.|\n|\r)*?)\">", "");
fileContent = fileContent.replaceAll("<!DOCTYPE((.|\n|\r)*?)>", "");
Esto elimina la entidad y luego el tipo de documento. Esto funciona bien si el código XML contiene declaraciones a continuación DOCTYPE en el 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;]>
Pero si tengo el tipo de documento que figura a continuación, que no funciona y la etiqueta de la raíz en el xml quedar despojado de:
<!DOCTYPE ichicsr SYSTEM "D:\UPGRADE\NTServices\Server\\Xml21.dtd"
[<!ENTITY % entitydoc SYSTEM 'D:\UPGRADE\NTServices\Server\\Xml21.dtd'>
]>
Por favor, hágamelo saber si la expresión regular que estoy usando es incorrecto o cualquier otra acción debe ser tomada.
Su enfoque no funciona, ya que han "
requerido antes de la final >
de la ENTITIY
expresión regular. Sólo puede reemplazar \"
con ['\"]
allí.
Además, nunca utilice (.|\n|\r)*?
en cualquier expresión regular, ya que es un asesino rendimiento. En lugar de ello, el uso .*?
con Pattern.DOTALL
(o en línea (?s)
variante), o al menos [\s\S]*?
.
Sin embargo, hay una manera mejor: fusionar las dos expresiones regulares en una sola:
fileContent = fileContent.replaceAll("(?i)<!DOCTYPE[^<>]*(?:<!ENTITY[^<>]*>[^<>]*)?>", "");
Vea la demostración de expresiones regulares .
detalles
(?i)
- caso insensiblePattern.CASE_INSENSITIVE
modificador inline<!DOCTYPE
- texto literal[^<>]*
- 0+ caracteres distintos<
y>
(?:<!ENTITY[^<>]*>[^<>]*)?
- una ocurrencia opcional de<!ENTITY
[^<>]*
- 0+ caracteres distintos<
y>
>
- un>
carbón de leña[^<>]*
- 0+ caracteres distintos<
y>
>
- un>
carbón de leña.