how to get these XML elements with libxml2?

2019-08-29 10:59发布

问题:

i have a XML structure:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<root>
<item>
    <foo1>1</foo1>
    <foo2>2</foo2>
</item>
<item>
    <foo1>3</foo1>
    <foo2>4</foo2>
</item>
</root>

now i go throw all children with a for loop:

for (pCurrentElement...) {

}

now i want to access throw pCurrentElement the foo1 and foo2 but i dont know how. i use LIBXML2

i can get foo1 with:

pChildElement = pCurrentElement->children->next;
pChildElement->children->content // foo1

but i dont know how to get foo2 now?

回答1:

By default, libxml2 parses whitespace within the document into its own child nodes. If there is whitespace in front of foo1 and foo2, then foo1 will be pCurrentElement->children->next, and foo2 will be pCurrentElement->children->next->next->next.

If you disable whitespace parsing, using either xmlKeepBlanksDefault(0) or xmlReadDoc(..., XML_PARSE_NOBLANKS), then foo1 will be pCurrentElement->children and foo2 will be pCurrentElement->children->next instead.



回答2:

Use xmlNextElementSibling. When applied to foo1, it gives you foo2.

Or loop through all the children while (child->next) and process only nodes of given type.



回答3:

pChildElement = pCurrentElement->children->next; //if this is pointing to <item>
pChildElement->children->content // foo1  // this is <item>->children->first element (which is foo1)

so naturally

pChildElement->children->next->content would be the next sibling of foo1, which is foo2


标签: xml libxml2