2010-10-09 7 views
3

J'ai une situation dans laquelle je reçois un fichier XML (document) d'une société externe. J'ai besoin de filtrer le document pour supprimer toutes les données qui ne m'intéressent pas. Le fichier fait environ 500 Ko mais sera demandé très souvent.Créer un document XML en filtrant un document existant dans C# à l'aide de xpath

laisser dire le fichier suivant:

<dvdlist> 
    <dvd> 
    <title>title 1</title> 
    <director>directory 2</director> 
    <price>1</price> 
    <location> 
     <city>denver</city> 
    </location> 
    </dvd> 
    <dvd> 
    <title>title 2</title> 
    <director>directory 2</director> 
    <price>2</price> 
    <location> 
     <city>london</city> 
    </location> 
    </dvd> 
    <dvd> 
    <title>title 3</title> 
    <director>directory 3</director> 
    <price>3</price> 
    <location> 
     <city>london</city> 
    </location> 
    </dvd> 
</dvdlist> 

Ce que je besoin est filtrer simplement le document basé sur la ville = Londres afin de mettre fin avec ce nouveau document XML

<dvdlist> 
    <dvd> 
    <title>title 2</title> 
    <director>directory 2</director> 
    <price>2</price> 
    <location> 
     <city>london</city> 
    </location> 
    </dvd> 
    <dvd> 
    <title>title 3</title> 
    <director>directory 3</director> 
    <price>3</price> 
    <location> 
     <city>london</city> 
    </location> 
    </dvd> 
</dvdlist> 

J'ai essayé ce qui suit

XmlDocument doc = new XmlDocument(); 
doc.Load(@"C:\Development\Website\dvds.xml"); 
XmlNode node = doc.SelectSingleNode("dvdlist/dvd/location/city[text()='london']"); 

Tout aide ou liens apprécieront

Merci

+0

Y a-t-il une raison particulière pour laquelle vous ne voulez pas utiliser Linq en XML? –

+0

Êtes-vous confronté à un problème? Tu as essayé quelque chose. ça a marché? – Kangkan

+0

@DoctaJonez. Non, il n'y en a pas. Si Linq est mieux adapté, je serai heureux de le faire. – Walid

Répondre

1

XPath est un langage d'expression de sélection - il ne modifie jamais le document XML (s), il fonctionne sur. Par conséquent, pour obtenir le nouveau document XML souhaité, vous devez utiliser XML DOM (non recommandé) ou appliquer une transformation XSLT au document XML. Ce dernier est la méthode recommandée, car XSLT est un langage spécialement conçu pour les transformations en arborescence.

Dans un .NET peut utiliser la classe XslCompiledTransform et sa méthode Transform(). En savoir plus à propos de ceux-ci dans le relevant MSDN documentation.

La transformation XSLT est lui-même extrêmement simple:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

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

<xsl:template match="dvd[not(location/city='london')]"/> 
</xsl:stylesheet> 

Here, vous pouvez trouver un exemple de code complet comment obtenir le résultat de la transformation en tant que XmlDocument (ou si on le souhaite, en tant XDocument).

+0

Merci Dimitre. Je vais y aller et je vous le ferai savoir.cheers – Walid

+0

Merci encore Dimitre. À la fin, je suis allé avec vos recommandations. C'est vrai que XSLT est facile quand on a la connaissance de xpath. – Walid

+0

@ Walid: Vous êtes les bienvenus. –

0

Voici un exemple en utilisant LINQ to XML.

//load the document 
var document = XDocument.Load(@"C:\Development\Website\dvds.xml"); 
//get all dvd nodes 
var dvds = document.Descendants().Where(node => node.Name == "dvd"); 
//get all dvd nodes that have a city node with a value of "london" 
var londonDVDs = dvds.Where(dvd => dvd.Descendants().Any(child => child.Name == "city" && child.Value == "london")); 
+0

Merci DoctaJonez. Je suis allé à travers ce tutoriel ci-dessous, comme je suis nouveau à Linq http://download.microsoft.com/download/c/f/b/cfbbc093-f3b3-4fdb-a170-604db2e29e99/XLinq%20Overview.doc et ont le code suivant qui me donne la liste dont j'ai besoin. chemin de chaîne = @ "C: \ Développement \ Site Web \ sp.xml"; var dvds = à partir de d dans XElement.Load (chemin) .Elements ("dvd") où d.Element ("location"). Element ("ville").Valeur == "london" sélectionnez d; Ma question est de savoir comment obtenir les données sous la forme d'un nouveau document XmlDocument – Walid

+0

Si vous utilisez LINQ to XML (c'est-à-dire XDocument), vous devez créer un nouveau XDocument, pas un XmlDocument. Créer un nouveau XDocument est facile: 'XDocument input = XDocument.Load (" input.xml "); XDocument output = new XDocument (nouveau XElement (input.Root.Name, input.Root.Elements ("dvd"). Où (d => (chaîne) d.Element ("location"). Element ("city") = = "london"))); output.Save ("output.xml"); '. –

+0

Merci Martin. C'était très utile. – Walid

Questions connexes