Retire tipo de documento XML que contiene de entidad Utilización de Java

nithin:

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.

Wiktor Stribiżav:

Su enfoque no funciona, ya que han "requerido antes de la final >de la ENTITIYexpresió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 insensible Pattern.CASE_INSENSITIVEmodificador 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.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=235418&siteId=1
Recomendado
Clasificación