我正在研究解析器以從XML文件中獲取數據。我正在使用libxml2來提取數據。我無法從節點獲取屬性。我只找到nb_attributes
以獲得屬性的數量。如何從libxml2中的節點獲取屬性
6
A
回答
1
試着這麼做:
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);
}
8
我覺得joostk意味着屬性 - >孩子,讓這樣的事情:
xmlAttr* attribute = node->properties;
while(attribute)
{
xmlChar* value = xmlNodeListGetString(node->doc, attribute->children, 1);
//do something with value
xmlFree(value);
attribute = attribute->next;
}
看看是否能爲你工作。
6
如果你只是想一個屬性,使用xmlGetProp或xmlGetNsProp
2
我想我找到了,爲什麼你只得到了1個屬性(至少它發生在我身上)。
問題是我讀了第一個節點的屬性,但接下來是文本節點。不知道爲什麼,但node->屬性給了我一個內存不可讀部分的引用,所以它崩潰了。
我的解決辦法是檢查節點類型(元素1)
我使用的是讀者,所以:
xmlTextReaderNodeType(reader)==1
整個代碼,你可以從http://www.xmlsoft.org/examples/reader1.c得到它,添加此
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;
}
}
排隊50
0
如果使用SAX方法startElementNs( ......),這個功能是你在找什麼:
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;
}
用法:
char * value = getAttributeValue("atrName", attributes, nb_attributes);
// do your magic
free(value);
0
我發現在C++中使用的libxml2(通過的libxml ++最簡單的方法)是使用eval_to_XXX
方法。他們評估XPath表達式,因此您需要使用@property
語法。
例如:
std::string get_property(xmlpp::Node *const &node) {
return node->eval_to_string("@property")
}
相關問題
- 1. 如何從節點列表中的節點獲取屬性?
- 2. 如何從節點獲取屬性xml
- 3. 從char數組獲取根節點libxml2
- 4. 獲取XML節點屬性
- 5. 從NSXMLDocument節點獲取屬性信息
- 6. XOM從節點獲取屬性?
- 7. 獲取xdocument中的節點屬性
- 8. 從節點獲取id屬性的節點列表
- 9. libxml2 - 獲取節點(xmlNodePtr)內容?
- 10. Xpath如何通過屬性C++刪除子節點libxml2
- 11. 如何通過模板xslt從子節點獲取祖父節點的屬性?
- 12. 從節點獲取子節點並傳入屬性
- 13. 如何從<?xml-stylesheet>節點獲取href屬性值?
- 14. 如何使用xpath從節點獲取屬性值?
- 15. VBA XML如何從子節點獲取父屬性?
- 16. 如何獲取路徑中的節點屬性的總值(Neo4j)?
- 17. 如何獲取jstree JSON數據中的節點屬性
- 18. 如何使用XPath在java中獲取BPMN節點的屬性?
- 19. 如何使用xpath在xml中獲取節點的屬性值?
- 20. 獲取節點集的屬性集合
- 21. 獲取特定的xml節點屬性
- 22. 獲取根節點屬性,jQuery的/ XML
- 23. 如何從XSLT中的子節點讀取父節點的屬性
- 24. 如何從XSLT中的子節點讀取父節點的屬性
- 25. 從XML文件中的節點獲取屬性值
- 26. 如何使用xmldocument中的子節點屬性值獲取父節點的屬性值?
- 27. 如何確定節點是否是libxml2中的葉節點?
- 28. 如何根據屬性值在neo4j中獲取節點
- 29. 如何獲取具有某個屬性的節點的所有子節點?
- 30. 通過c#獲取xml節點屬性
嗨墊。我發現你的代碼有助於找出屬性的值。但它只給出第一個節點的值。如何獲取下列節點的值。 ??.. 提前致謝。 – NiKKi 2012-06-01 09:31:49
不應該`node-children`成爲`attribute-> children`? – 2013-04-20 09:58:30
是的,它應該:)另見@Matthew Lowe,他早先注意到了錯誤。我已經更新了答案(2.5年後;)) – Joost 2013-04-21 00:22:39