Comment puis-je utiliser POCO de parser un fichier xml et d'en extraire un nœud particulier à un std::string?
Je veux extraire un nœud particulier à l'aide de POCO de bibliothèques, mais ne peuvent pas comprendre comment le faire. Je suis nouveau sur XML.
Le XML lui-même ressemble à quelque chose comme ceci (en abrégé):
<?xml version="1.0" encoding="UTF-8"?>
<!-- Created by XMLPrettyPrinter on 11/28/2012 from -->
<sbml xmlns = "http://www.sbml.org/sbml/level2/version4" level = "2" version = "4">
<model id = "cell">
<listOfSpecies>
</listOfSpecies>
<listOfParameters>
<parameter id = "kk1" value = "1"/>
</listOfParameters>
<listOfReactions>
<reaction id = "J1" reversible = "false">
... much stuff here ..
</listOfReactions>
</model>
</sbml>
Je veux extraire tout dans le listOfReactions nœud et de le stocker dans un std::string, pour plus tard, le hachage MD5.
J'ai essayé ceci:
ifstream in(JoinPath(gTestDataFolder, "Test_1.xml").c_str());
InputSource src(in);
DOMParser parser;
AutoPtr<Document> pDoc = parser.parse(&src);
NodeIterator it(pDoc, Poco::XML::NodeFilter::SHOW_ALL);
Node* pNode = it.nextNode();
while(pNode)
{
clog<<pNode->nodeName()<<endl;
string elementID = "listOfReactions";
if(pNode->nodeName() == "listOfReactions")
{
//Extract everything in this node... how???
}
pNode = it.nextNode();
}
- Alors, qu'avez-vous essayé?
- J'ai essayé de leur exemple, impliquant un DOM parser. Je suis en mesure d'obtenir pour le nœud, mais ne sais pas chaud pour en extraire son contenu. Je peux imprimer pNode->getNodeValue(), mais qui imprime rien..
- Le nœud "listOfReactions" ne tient pas la valeur. Il y a un enfant nœud avec le nom "#texte" le maintien de la valeur. Il n'est pas évident, mais en faisant "pNode->firstNode()->nodeValue()" permet d'obtenir la valeur.
Vous devez vous connecter pour publier un commentaire.
J'ai rencontré un problème similaire moi-même. Par exemple, dans votre cas avec la "Poco::XML::NodeFilter::SHOW_ALL" filtre est appliqué, tous les types de nœud(Élément de Texte, CDataSection, etc) sera incluse lors de l'iteratering à travers le document XML. J'ai trouvé que POCO ne comprend pas toutes les données dans chaque nœud, il retourne à partir de "NextNode()".
Si l'on veut accéder à un des nœuds XML attributs, on doit d'abord interroger le nœud de vérifier s'il a des attributs à l'aide de "hasAttributes()" et puis, si elle n', itérer sur chacun de ces attributs pour trouver celles qui l'intéressent.
XML Exemple:
C++ Exemple:
Doit de sortie:
Si l'on veut accéder au texte entre les deux balises XML, comme le montre l'exemple de XML ci-dessous, on doit d'abord trouver le nœud avec un nom qui correspond à la balise d'intérêt, comme vous l'avez fait dans votre exemple, et puis vérifier le nœud suivant en appelant "NextNode()" pour voir si ce nœud est le nom du nœud "#texte" ou "#cdata-section". Si c'est le cas, la valeur de ce "nœud" contiendra le texte entre les balises XML.
XML Exemple:
C++ Exemple:
Doit de sortie:
Essayer ces diapositives, et la Poco de la documentation pour la référence de l'API.
Il ya aussi une belle tutoriel ici qui est simple à comprendre, par exemple de ce que vous essayez de faire.
Tard pour le jeu, mais peut-être encore utile. Je suis à la recherche dans Poco XML pour extraire des données météorologiques livré en xml. J'ai trouvé le PDF-diapositive @JBently mentionner comme une bonne introduction. Cette offre de l'hpp-fichier. Cette exemple couvre la mise en œuvre. J'ai omis LexicalHandler.
Je m'occupe de la chaîne listOfReactions, et, une fois trouvé, j'ai ajouter un attribut de nom et de valeur à une chaîne dans startElement(). Dans les caractères() j'ai ajouter le texte dans le nœud de la corde et de l'ajouter à un vecteur, qui peut être parcouru.
De sortie:
J'ai changé votre xml légèrement pour les tests, et s'est échappé des guillemets à utiliser dans le programme.
principal:
MyHandler.hpp:
MyHandler.cpp:
En supposant XML ci-dessous dans le fichier "hello.xml"
On pourrait analyser ce donc:-
Espère que ça aide.