¿Cómo elimino elementos con ciertos Ancestros?

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!

preguntado el 03 de mayo de 12 a las 17:05

Mientras estoy en eso, en lugar de usar xe.Attribute("value").Value = "";, puedes usar esto en su lugar xe.Attribute("value").Remove();? Si no rompe su código, eso es. Hará que el xml sea más pequeño eliminando todo el atributo. -

Lo 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? -

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) -

TODOS 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!! -

1 Respuestas

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 or haz tu propia pregunta.