2013-05-15 7 views
0

Accordé Je suis en train d'apprendre à le faire, mais je pense que je le fais plus difficile qu'il doit êtreanalyse syntaxique xml et d'inverser l'ordre

Nous, eh bien, j'ai donné ce fichier xml. Il s'agit simplement d'un ensemble de données d'événements, mais le groupe qui a besoin de ces données a besoin des données inversées. Actuellement, il n'affiche pas les dates les plus récentes en premier.

Quelle est la meilleure méthode pour analyser ce fichier, inverser l'ordre et le recracher en XML?

Toute aide serait appréciée.

Exemple de XML ci-dessous: Je veux modifier l'ordre/ordre inverse le champ de localisation/noeud pour chacun des événements [1-4]

<rss version="2.0"> 
    <channel> 
     <title>Thunder Dome - Calendar - Villiage Ctr</title> 
     <link>https://www.??????/?????.aspx</link> 
     <update>Wed, 15 June 2013 09:30 -0500</update> 
     <location>Thunder Dome - Upcoming Events</location> 
     <language>en-us</language> 
     <item> 
      <title>Event 1</title> 
      <link>https://www.??????/?????.aspx</link> 
      <pubDate>Wed, 15 June 2013 08:46 -0500</pubDate> 
      <location>June 29, 2013<br>, 8:00 AM, Town Square</location> 
      <guid>https://www.??????/?????.aspx</guid> 
     </item> 
     <item> 
      <title>Event 2</title> 
      <link>https://www.??????/?????.aspx</link> 
      <pubDate>Wed, 15 June 2013 08:43 -0500</pubDate> 
      <location>June 23, 2013<br>, 6:00 PM, Danny's Bar and Grill</location> 
      <guid>https://www.??????/?????.aspx</guid> 
     </item> 
     <item> 
     <title>Event 3</title> 
      <link>https://www.??????/?????.aspx</link> 
      <pubDate>Wed, 15 June 2013 08:43 -0500</pubDate> 
      <location>June 21, 2013<br>, 7:00 PM, Auditoriam</location> 
      <guid>https://www.??????/?????.aspx</guid> 
     </item> 
     <item> 
      <title>Event 4</title> 
      <link>https://www.??????/?????.aspx</link> 
      <pubDate>Wed, 15 June 2013 09:30 -0500</pubDate> 
      <location>June 20, 2013<br>, 6:30 PM, Grarage</location> 
      <guid>https://www.??????/?????.aspx</guid> 
     </item> 
    </channel> 
</rss> 
+1

Toute langue particulière ou plate-forme? Python? Perl? Java? MS Windows? XSLT? – Vorsprung

+0

La langue que le département utilise est php, mais ils me donnent simplement le fichier .xml, alors j'ai besoin d'inverser ce champ de date. En fait, c'est un champ de localisation qui a des données comme celle-ci: 15 juin 2013,
, 14h00, Mall Corners. – user1176783

Répondre

1

Il est très facile de le faire dans XSLT. Bien que l'apprentissage d'une nouvelle langue pour la tâche puisse être un peu lourd, les compétences seront utiles avec tout travail XML ultérieur.

Vous avez essentiellement besoin de deux règles de modèle. La première copie tout le même:

<xsl:template match="*"> 
    <xsl:copy> 
    <xsl:copy-of select="@*"/> 
    <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 

et le second gère la remise en ordre des éléments dans l'élément de canal:

<xsl:template match="channel"> 
    <xsl:apply-templates select="*[not(self::item)]"/> 
    <xsl:apply-templates select="item"> 
    <xsl:sort select="-position()" data-type="number"/> 
    </xsl:apply-templates> 
</xsl:template> 
+0

Vous avez raison, apprendre quelque chose de nouveau et essayer de sortir le produit final n'est pas une bonne chose. Je vais poser les questions, alors pardonnez si elles sont stupides. lecture rapide de xslt, c'est pour styliser des feuilles de xml, donc vous pouvez appliquer css essentiellement. Je veux juste réorganiser ce qui est dans le xml, sortir un autre fichier xml et le remettre. Donc, je ne comprends pas, je crée un autre fichier avec les modèles que vous mentionnez ci-dessus ou .. – user1176783

+0

cela a fonctionné Michael, mais maintenant les questions/problème est - la sortie de xsl est juste le texte, dans l'ordre que je veux, mais J'en ai besoin dans un format xml montré ci-dessus. Donc maintenant avec plus de lecture, ce n'est pas la sortie que je veux dans l'ordre inverse, c'est le fichier xml lui-même que je veux tirer, inverser l'ordre des noeuds et sauvegarder au format de fichier xml. J'ai besoin de quelque chose pour re-rendre le fichier XML avec l'ordre de noeud inversé ou dans l'ordre par l'emplacement. – user1176783

+0

XSLT est un langage de transformation XML-XML; la conversion de XML en HTML n'est qu'un cas particulier (commun). Si vous recevez du texte plutôt que XML, vous faites quelque chose de mal. –

0

Si vous savez comment utiliser XSLT, voici un précédent article fait ce que vous décrivez:

XSLT: How to reverse output without sorting by content

Votre XML est pas valide affiché le, d'abord, vous devez donc entourer vos <location> éléments avec des sections CDATA si vous voulez l'analyser, comme ceci:

<location><![CDATA[June 29, 2013<br>, 8:00 AM, Town Square]]></location> 

S'il est juste le nœud <location> que vous voulez inverser l'ordre de la date et du lieu, de telle sorte que la sortie ressemble à:

<location>Town Square, June 29, 2013<br>, 8:00 AM</location> 

Vous pouvez partir sans parsing XML, il suffit d'utiliser une expression régulière pour permuter l'ordre pour ce nœud particulier:

sed 's/<location>\(.* [AP]M\), \(.*\)</<location>\2, \1</g' rss.xml 
+0

Salut davidfmatheson - Je poste un exemple de code ci-dessus. – user1176783