Ich arbeite an einem Parser, um Daten aus einer XML-Datei zu erhalten. Ich verwende libxml2, um Daten zu extrahieren. Ich bin nicht in der Lage, die Attribute von Knoten zu bekommen. Ich habe nur nb_attributes
gefunden, um die Anzahl der Attribute zu erhalten.So erhalten Sie Attribute von einem Knoten in libxml2
Antwort
Versuchen Sie so etwas wie:
xmlNodePtr node; // Some node
NSMutableArray *attributes = [NSMutableArray array];
for(xmlAttrPtr attribute = node->properties; attribute != NULL; attribute = attribute->next){
xmlChar *content = xmlNodeListGetString(node->doc, attribute->children, YES);
[attributes addObject:[NSString stringWithUTF8String:content]];
xmlFree(content);
}
Ich denke joostk gemeint Attribut-> Kinder, so etwas wie dieses geben:
xmlAttr* attribute = node->properties;
while(attribute)
{
xmlChar* value = xmlNodeListGetString(node->doc, attribute->children, 1);
//do something with value
xmlFree(value);
attribute = attribute->next;
}
Sehen, ob das für Sie arbeitet.
Hallo Mat. Ich fand Ihren Code hilfreich, um die Werte von Attribut herauszufinden. Aber es gibt den Wert nur für den ersten Knoten. Wie man Werte auch für die folgenden Knoten erhält. ??.. Danke im Voraus. – NiKKi
Sie können über Knoten auf die gleiche Weise iterieren, wie Sie über Attribute iterieren: node = node-> next. –
, wenn Sie nur ein einziges Attribut möchten, verwenden Sie xmlGetProp oder xmlGetNsProp
Ich glaube, ich gefunden, warum Sie nur 1 Attribut bekam (zumindest ist es mir passiert ist).
Das Problem war, dass ich Attribute für den ersten Knoten lesen, aber das nächste ist ein Textknoten. Ich weiß nicht warum, aber node-> properties gibt mir einen Verweis auf einen nicht lesbaren Teil des Speichers, so dass es abgestürzt ist.
war meine Lösung Knotentyp zu überprüfen (Element 1)
Ich bin ein Leser mit, so:
xmlTextReaderNodeType(reader)==1
Der gesamte Code, den Sie es aus http://www.xmlsoft.org/examples/reader1.c und fügen dieses
bekommenxmlNodePtr node= xmlTextReaderCurrentNode(reader);
if (xmlTextReaderNodeType(reader)==1 && node && node->properties) {
xmlAttr* attribute = node->properties;
while(attribute && attribute->name && attribute->children)
{
xmlChar* value = xmlNodeListGetString(node->doc, attribute->children, 1);
printf ("Atributo %s: %s\n",attribute->name, value);
xmlFree(value);
attribute = attribute->next;
}
}
50.
Linie Wenn Sie SAX-Methode startElementNs verwenden (...), ist diese Funktion, was Sie suchen:
xmlChar *getAttributeValue(char *name, const xmlChar ** attributes,
int nb_attributes)
{
int i;
const int fields = 5; /* (localname/prefix/URI/value/end) */
xmlChar *value;
size_t size;
for (i = 0; i < nb_attributes; i++) {
const xmlChar *localname = attributes[i * fields + 0];
const xmlChar *prefix = attributes[i * fields + 1];
const xmlChar *URI = attributes[i * fields + 2];
const xmlChar *value_start = attributes[i * fields + 3];
const xmlChar *value_end = attributes[i * fields + 4];
if (strcmp((char *)localname, name))
continue;
size = value_end - value_start;
value = (xmlChar *) malloc(sizeof(xmlChar) * size + 1);
memcpy(value, value_start, size);
value[size] = '\0';
return value;
}
return NULL;
}
Verbrauch:
char * value = getAttributeValue("atrName", attributes, nb_attributes);
// do your magic
free(value);
Der einfachste Weg, ich mit libxml2 gefunden (über libxml ++ in C++) war die eval_to_XXX
Methoden zu verwenden. Sie werten einen XPath-Ausdruck aus, daher müssen Sie die -Syntax verwenden.
Zum Beispiel:
std::string get_property(xmlpp::Node *const &node) {
return node->eval_to_string("@property")
}
Der effizientere und direktere Weg mit libxml ++ ist 'return std :: string (dynamic_cast
- 1. Mono.Cecil - So erhalten Sie benutzerdefinierte Attribute
- 2. Python 2.7 libxml2, XPath, extrahieren XML-Attribute
- 3. So erhalten Sie Attribute mit Namespace "Android" in benutzerdefinierten TextView
- 4. So erhalten Sie Attribute von zugeordneten Modellen aus einem Modell in Rails
- 5. PHP Soapserver - Attribute in Knoten
- 6. Erhalten Sie bestimmte Attribute von einem ActiveRecord-Modell
- 7. Erhalten Sie benutzerdefinierte Attribute von Aufzählungswert
- 8. So erhalten Sie den eindeutigen Knoten ohne Verwendung von "contain"
- 9. So erhalten Sie unsignierte Attribute aus losgelöster Signatur mit BouncyCastle
- 10. So entfernen Sie Attribute eines Knotens (MSXML)
- 11. wählen zwei Attribute in einem Knoten mithilfe von LINQ
- 12. Wie bekomme ich die Attribute von einem Knoten xml
- 13. Anfügen benutzerdefinierte Attribute zu einem DOM-Knoten
- 14. So erhalten Sie Attribute Werte bei Änderung der Dropdown-Auswahl
- 15. So erhalten Sie eine Liste aller untergeordneten Knoten in einem TreeView in .NET
- 16. So erhalten Sie den ausgewählten Knoten im Paket-Explorer von einem Eclipse-Plugin
- 17. So erhalten Sie Elternkomponentenattribute
- 18. libxml2 von java
- 19. So erhalten Sie ausgewählte Zeilen von Checkcolumn in einem Raster
- 20. So erhalten Sie Elemente von einem Array in einer Funktion
- 21. So erhalten Sie Umgebung von einem Subprozess in Python
- 22. Wie überschreiben Standard-Knoten-Attribute in Chef
- 23. Erhalten Sie alle Kommentar-IDs in einem Drupal-Knoten
- 24. So können Sie Attribute in Firebase filtern/verbergen
- 25. So arbeiten Sie request.render in Knoten js
- 26. So erhalten Sie Client-IP von SimpleHTTPServer
- 27. Abrufen von XML-Knoten-Attribute und Werte
- 28. So lesen Sie das Attribut eines übergeordneten Knotens von einem untergeordneten Knoten in XSLT
- 29. So erhalten Sie Spaltenmetadaten aus einem Tabellensynonym
- 30. Erhalten Sie einige Attribute aller Kontrollkästchen
Hallo Mat. Ich fand Ihren Code hilfreich, um die Werte von Attribut herauszufinden. Aber es gibt den Wert nur für den ersten Knoten. Wie man Werte auch für die folgenden Knoten erhält. ??.. Danke im Voraus. – NiKKi
Sollten "Knoten-Kinder" nicht zu "Attribut-> Kindern" werden? –
Ja sollte es :) Siehe auch @ Matthew Lowe, er bemerkte den Fehler früher. Ich habe die Antwort aktualisiert (2.5 Jahre später;)) – Joost