¿Cómo elimino elementos con ciertos Ancestros?
Frecuentes
Visto 94 veces
2
Estoy tratando de establecer el valor de todos los elementos "CSS" "valor" a "", aquí está el código:
XDocument doc = XDocument.Load(fi.FullName);
XNamespace rep = "http://developer.cognos.com/schemas/report/8.0/";
List<XElement> cssElements =
(from e in doc.Root.DescendantsAndSelf(rep + "CSS")
where
(
(e.Attribute("value") != null)
)
select e).ToList();
//modify Attribute in elements
foreach (XElement xe in cssElements)
{
xe.Attribute("value").Value = "";
}
Pero no quiero modificar este CSS, que tiene como ancestros "crosstab" y "style" (xml a continuación):
<crosstab name="Crosstab1" refQuery="Query1">
<crosstabSuppress type="rows"/>
<style>
<CSS value="border-collapse:collapse;font-family:'Times New Roman'"/>
¿Cómo puedo hacer eso? ¡Gracias!
1 Respuestas
1
Si te entendí bien, tal vez algo como esto:
...
List<XElement> cssElements =
(from e in doc.Root.DescendantsAndSelf(rep + "CSS")
where
(
(e.Attribute("value") != null) && !(e.Ancestors(rep + "style").Any() && e.Ancestors(rep + "crosstab").Any())
)
select e).ToList();
...
Solo agregué esto a tu where
-cláusula:
&& !(e.Ancestors(rep + "style").Any() && e.Ancestors(rep + "crosstab").Any())
contestado el 03 de mayo de 12 a las 17:05
Tiene sentido, pero no funcionó... También agregué algunos paréntesis, pero aún no funciona, restableció todo el CSS. ((e.Attribute("value") != null) && !((e.Ancestors("style").Any() && e.Ancestors("crosstab").Any()))) - MariusD
¿Puede proporcionar más del xml? (Ambos valores que deben ser editados y no.) - Mario S.
@MariusD, Mario, debes tener en cuenta el espacio de nombres. Tratar Ancestors(rep + "style")
y Ancestors(rep + "crosstab")
. - Frederic Hamidi
Totalmente correcto, probé sin =) Ahora actualicé la pregunta. - Mario S.
¡Gracias! ¡Me olvidé por completo del espacio de nombres!. - MariusD
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas c# xml linq-to-xml or haz tu propia pregunta.
Mientras estoy en eso, en lugar de usar
xe.Attribute("value").Value = "";
, puedes usar esto en su lugarxe.Attribute("value").Remove();
? Si no rompe su código, eso es. Hará que el xml sea más pequeño eliminando todo el atributo. - Mario SLo intenté, pero rompe el informe de Cognos (el xml es esencialmente un informe de Cognos). ¡Gracias! Por cierto, ahora no los obtengo todos (CSS), hay algunos CSS que aún cumplen con la condición, tienen "tablas cruzadas" y "estilo" como ancestros, pero también tienen otros ancestros, ahora yo Estoy buscando una manera de eliminarlos, en otras palabras, establecer una condición para eliminar todo el CSS con , solamente "tab cruzado" y "estilo" como ancestros... ¿Alguna idea? - MariusD
Podrías crear un método para usar en el dónde cláusula y envíe el elemento. En el método, verifique si el elemento tiene tanto "estilo" como "tab cruzado" y luego
element.Ancestors().Any(e => e.Name != "style" || e.Name != "crosstab")
algo como eso. Tal vez ignorando el caso. (No recuerdo si XElement.Name es la propiedad correcta, pero supongo que puedes averiguarlo) - Mario STODOS los demás CSS tenían crosstabNode como antepasado, así que cambié la condición a:
(from e in doc.Root.DescendantsAndSelf(rep + "CSS") where ( (e.Attribute("value") != null) && !(e.Ancestors(rep + "style").Any() && e.Ancestors(rep + "crosstab").Any() && !(e.Ancestors(rep + "crosstabNode").Any())) )
. ¡¡Muchas gracias por tu ayuda!! - MariusD