Pele los estilos específicos del atributo Estilo en la cadena Html usando Html Agility Pack

c# html-agility-pack html-parsing

Pregunta

Tengo una cadena de Html y contiene Html variado pero incluye esto

<span style="display:block;position:fixed;width:100%;height:2000px;background-color:rgba(0,0,0,0);z-index:9999!important;top:0;left:0;cursor:default;"></span>

Esto parecerá extraño, pero solo quiero eliminar elementos específicos dentro del atributo de estilo (para todos los elementos HTML). Por ejemplo quiero quitar

position:fixed e z-index:9999!important; y top:0; e left:0;

Para nombrar unos pocos, pero guarda todo lo demás. Ahora el problema es que no es necesariamente una position:fixed; podría ser position:absolute; o lo que sea. Así como podría ser z-index:9998; o top:20; etc ...

Necesito poder eliminar elementos de estilo por su clave, así que position:*anything* y top:*anything* etc ... Y también hacerlo de una manera que no distinga mayúsculas y minúsculas. Entonces obtendría POSITION:*anything* o PoSition:*anything*

¿Hay alguna manera de lograr esto usando el paquete de agilidad de HTML?

Respuesta popular

No parece haber ninguna compatibilidad para el análisis de cadenas de estilo en línea en el Paquete de agilidad de HTML, pero .NET tiene algunas capacidades para esto en System.Web.UI para admitir los controles de formularios web.

Se llama CssStyleCollection y convertirá su cadena de style en una buena variedad de pares de clave / valor de cadena, y le permitirá eliminar las claves específicas que no desea.

Sin embargo, ya que es una herramienta interna para el uso de WebControl, no tiene un constructor público. En su lugar, tienes que crear una instancia a través de la reflexión, o usar un truco como este;

CssStyleCollection style = new Panel().Style;

Una vez creado,

style.Value = "YOUR STYLE STRING"; 

Y luego retire los elementos que no desea;

style.Remove("position");
style.Remove("z-index");
style.Remove("top");
style.Remove("left");

Recupere su nueva cadena de estilo delimitado de style.Value .

IMPORTANTE: no he probado esto, pero el proceso parece bastante simple, aunque un poco pirateado. Puede haber algunas sorpresas que no he encontrado todavía. En particular, no tengo idea de cómo maneja las situaciones donde hay múltiples configuraciones de estilo duplicadas en la misma cadena;

top:0;margin-left:20;top:10; 

En las cadenas de estilo en línea, los navegadores respetarán el último valor especificado, por lo que top:10 victorias. Sin embargo, dado que CssStyleCollection usa claves únicas, no puede almacenar los dos valores top y lo más probable es que descarte uno.



Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué