2009-03-02 8 views

Répondre

4

Avec XmlDocument, vous devrez importer ces noeuds dans un second document;

XmlDocument doc = new XmlDocument(); 
    XmlElement root = (XmlElement)doc.AppendChild(doc.CreateElement("root")); 
    XmlNodeList list = // your query 
    foreach (XmlElement child in list) 
    { 
     root.AppendChild(doc.ImportNode(child, true)); 
    } 
+0

En fin de c'est la réponse que je suis allé avec. –

0

Je viens de penser à un moyen de le faire, mais il ne semble pas très élégant.

utiliser un StringBuilder pour combiner les OuterXml de chacun des XMLNodes dans le XmlNodeList ...

Comme je l'ai dit est inélégante mais je pense que cela pourrait fonctionner. J'apprécierais toute autre suggestion ...

1

C'est une raison assez typique d'utiliser XSLT, qui est un outil efficace et puissant pour transformer un document XML en un autre (ou en HTML ou texte).

Voici un programme minimal pour effectuer une transformation XSLT et envoyer les résultats à la console:

using System; 
using System.Xml; 
using System.Xml.Xsl; 

namespace XsltTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      XslCompiledTransform xslt = new XslCompiledTransform(); 
      xslt.Load("test.xslt"); 

      XmlWriter xw = XmlWriter.Create(Console.Out); 
      xslt.Transform("input.xml", xw); 
      xw.Flush(); 
      xw.Close(); 

      Console.ReadKey(); 
     } 
    } 
} 

Voici le XSLT réelle, qui est enregistré dans test.xslt dans le répertoire du programme. C'est assez simple: étant donné un document d'entrée dont l'élément de niveau supérieur est input, il crée un élément output et est copié sur chaque élément enfant dont l'attribut value est défini sur true.

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="/input"> 
     <output> 
     <xsl:apply-templates select="*[@value='true']"/> 
     </output> 
    </xsl:template> 

    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

Et voici input.xml:

<?xml version="1.0" encoding="utf-8" ?> 
<input> 
    <element value="true"> 
    <p>This will get copied to the output.</p> 
    <p>Note that the use of the identity transform means that all of this content 
    gets copied to the output simply because templates were applied to the 
    <em>element</em> element. 
    </p> 
    </element> 
    <element value="false"> 
    <p>This, on the other hand, won't get copied to the output.</p> 
    </element> 
</input> 
+0

Ce serait mais je filtre dynamiquement donc je ne sais pas à l'avance ce dont j'ai besoin pour le filtrer. +1 pour XSLT qui sont plutôt cool. –

+0

Il existe de nombreuses façons de filtrer dynamiquement avec XSLT. Vous pouvez passer des arguments dans une transformation. ces arguments peuvent contenir des critères de filtrage que votre transformation lit et applique. –

Questions connexes