2012-01-23 8 views
6

Mi XML está debajo;Eliminar nodos específicos bajo la raíz XML?

<XML ID="Microsoft Search Thesaurus"> 
<thesaurus xmlns="x-schema:tsSchema.xml"> 
    <diacritics_sensitive>1</diacritics_sensitive> 
    <expansion> 
    <sub>Internet Explorer</sub> 
    <sub>IE</sub> 
    <sub>IE5</sub> 
    </expansion> 
    <expansion> 
    <sub>run</sub> 
    <sub>jog</sub> 
    </expansion> 
</thesaurus> 
</XML> 

Quiero eliminar los nodos de "expansión" del XML. Después de eliminar el proceso, sería así;

<XML ID="Microsoft Search Thesaurus"> 
<thesaurus xmlns="x-schema:tsSchema.xml"> 

</thesaurus> 
</XML> 

Mi código está por debajo;

XDocument tseng = XDocument.Load("C:\\tseng.xml"); 
XElement root = tseng.Element("XML").Element("thesaurus"); 
root.Remove(); 
tseng.Save("C:\\tseng.xml"); 

Recibí un error "Referencia de objeto no establecida en una instancia de un objeto". para la línea "root.Remove()". ¿Cómo puedo eliminar los nodos de "expansión" del archivo XML? Gracias.

Respuesta

3

Use:

eliminará sólo expansion elementos:

XNamespace ns = "x-schema:tsSchema.xml"; 
tseng.Root.Element(ns + "thesaurus") 
    .Elements(ns + "expansion").Remove(); 

eliminará todos los niños de thesaurus:

XNamespace ns = "x-schema:tsSchema.xml"; 
tseng.Root.Element(ns + "thesaurus").Elements().Remove(); 
+0

Gracias por su respuesta. Es útil para mí. – mkacar

+0

@mkacar, ¡De nada! –

0

Algo así como

XElement root = tseng.Element("XML").Element("thesaurus"); 
tseng.Element("XML").Remove(thesaurus); 

se quita un nodo desde el que es padre ...

si desea eliminar sólo los nodos de expansión, entonces, básicamente, a encontrar un quite hasta tere no están en ningún tesauro, o devolver una lista de ellos y recorrerlos para eliminarlos de su diccionario de sinónimos principal.

0

no tiene éxito porque su thesaurus tienen diferentes espacio de nombres . Necesita especificar ti para que funcione.

XNamespace ns = "x-schema:tsSchema.xml"; 
XDocument tseng = XDocument.Parse(xml); 

XElement root = tseng.Element("XML").Element(ns + "thesaurus"); 
root.Elements().Remove(); 

En general, su código es válido. Lo único que necesita para eliminar elementos secundarios no es root para obtener los resultados que necesita.

Cuestiones relacionadas