Estoy trabajando en un analizador para obtener datos de un archivo XML. Estoy usando libxml2 para extraer datos. No soy capaz de obtener los atributos de los nodos. Solo encontré nb_attributes
para obtener el recuento de los atributos.Cómo obtener atributos de un nodo en libxml2
Respuesta
Pruebe algo como:
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);
}
Creo joostk significaba atributo-> niños, dando algo como esto:
xmlAttr* attribute = node->properties;
while(attribute)
{
xmlChar* value = xmlNodeListGetString(node->doc, attribute->children, 1);
//do something with value
xmlFree(value);
attribute = attribute->next;
}
ver si funciona para usted.
Hola Mat. Encontré tu código útil para descubrir los valores de atributo. Pero da el valor solo para el primer nodo. Cómo obtener valores para los siguientes nodos también. ??.. Gracias por adelantado. – NiKKi
Puede iterar sobre nodos del mismo modo que itera sobre los atributos: node = node-> next. –
si lo que desea un único atributo, utilice xmlGetProp o xmlGetNsProp
Creo que he encontrado por la que solo recibió 1 atributo (por lo menos a mi me pasó).
El problema es que leo los atributos para el primer nodo pero a continuación aparece un nodo de texto. No sé por qué, pero node-> properties me da una referencia a una parte no legible de la memoria, por lo que se colgó.
Mi solución fue la de comprobar el tipo de nodo (elemento es 1)
estoy usando un lector, por lo que:
xmlTextReaderNodeType(reader)==1
El código completo se puede obtener de http://www.xmlsoft.org/examples/reader1.c y añadir esta
xmlNodePtr 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;
}
}
a la línea 50.
Si utiliza el método SAX startElementNs (...), esta función es lo que busca:
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;
}
Uso:
char * value = getAttributeValue("atrName", attributes, nb_attributes);
// do your magic
free(value);
La forma más sencilla que encontré usando libxml2 (a través de libxml ++ en C++) era utilizar los métodos eval_to_XXX
. Evalúan una expresión XPath, por lo que debe usar la sintaxis @property
.
Por ejemplo:
std::string get_property(xmlpp::Node *const &node) {
return node->eval_to_string("@property")
}
La forma más eficiente y directa con libxml ++ es 'return std :: string (dynamic_cast
- 1. libxml2 no puede acercarse contenido del nodo
- 2. Cómo obtener atributos de nodo raíz en java
- 3. php dom obtener todos los atributos de un nodo
- 4. Agregar atributos a un nodo XML
- 5. Conseguir el nodo padre atributos en XSL
- 6. Anexar atributos personalizados a un nodo DOM
- 7. XStream: nodo con atributos y nodo de texto?
- 8. libxml2 Análisis de HTML
- 9. ¿Cómo instalar libxml2 en virtualenv?
- 10. cómo obtener la identificación de un nodo en TinyMCE?
- 11. ¿Cómo obtener el nombre de nodo primario del nodo actual?
- 12. ¿Cómo obtener el nodo principal en Capibara?
- 13. Agregar libxml2 en XCode
- 14. obtener el atributo de un nodo padre
- 15. ¿Cómo puedo obtener atributos personalizados?
- 16. cómo usar libxml2 para modificar un archivo xml existente?
- 17. Cómo obtener el nodo XML de XDocument
- 18. ¿Cómo obtener el nodo de texto de un elemento?
- 19. jQuery obtener nodo DOM?
- 20. ¿Cómo puedo obtener un Nodo adyacente a un Nodo único usando Scala?
- 21. ¿Cómo crear un nodo duplicado desde un nodo en Neo4j?
- 22. libxml2 de java
- 23. Cómo obtener atributos de elementos de llavero
- 24. En GWT, ¿cómo puedo obtener todos los atributos de un elemento en el HTML DOM?
- 25. Nokogiri para obtener html en bruto de un nodo
- 26. Obtener la coordenada global de un nodo en JavaFX
- 27. cómo encontrar un nodo particular en Neo4j
- 28. XSL para copiar el nodo raíz en + agregar atributos
- 29. jquery obtener atributos
- 30. Obtener nodo hijo de otro nodo, teniendo en cuenta el nombre del nodo
Hola Mat. Encontré tu código útil para descubrir los valores de atributo. Pero da el valor solo para el primer nodo. Cómo obtener valores para los siguientes nodos también. ??.. Gracias por adelantado. – NiKKi
¿No debería 'node-children' convertirse en' attribute-> children'? –
Sí, debería :) También vea @Matthew Lowe, notó el error antes. He actualizado la respuesta (2.5 años después;)) – Joost