}
}
+static void
+print_xml (xmlDoc *doc, xmlNode *node)
+{
+ xmlBuffer *buf = xmlBufferCreate();
+ xmlNodeDump (buf, doc, node, 0, 1);
+ xmlBufferDump (stdout, buf);
+ xmlBufferFree (buf);
+ putchar ('\n');
+}
+
static void
print_element (xmlDoc *doc, xmlNode *node, const char *element)
{
for (; node; node = node->next)
{
- if (!strcmp(element, (char *) node->name))
+ if (node->name && !strcmp(element, (char *) node->name))
+ print_xml (doc, node);
+
+ print_element (doc, node->children, element);
+ }
+}
+
+static void
+print_id (xmlDoc *doc, xmlNode *node, const char *id)
+{
+ for (; node; node = node->next)
+ {
+ if (node->type == XML_ELEMENT_NODE)
{
- xmlBuffer *buf = xmlBufferCreate();
- xmlNodeDump (buf, doc, node, 0, 1);
- xmlBufferDump (stdout, buf);
- xmlBufferFree (buf);
- putchar ('\n');
+ const char *node_id = (char *) xmlGetProp (node, (xmlChar *) "id");
+ if (node_id && !strcmp (node_id, id))
+ {
+ print_xml (doc, node);
+ break;
+ }
}
- print_element (doc, node->children, element);
+ print_id (doc, node->children, id);
}
}
print_element (doc, root, argv[2] + 8);
else if (!strncmp(argv[2], "attr:", 5))
print_attribute (root, argv[2] + 5);
+ else if (!strncmp(argv[2], "id:", 3))
+ print_id (doc, root, argv[2] + 3);
else if (!strcmp(argv[2], "labels"))
print_labels (root);
else