]> xenbits.xensource.com Git - libvirt.git/commitdiff
util: xml: Introduce virXMLNodeGetSubelementList
authorPeter Krempa <pkrempa@redhat.com>
Mon, 13 Feb 2023 14:53:23 +0000 (15:53 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 5 Jun 2023 11:23:06 +0000 (13:23 +0200)
The new helper is similar to virXPathNodeSet list but for cases where we
want to get subelements directly rather than using XPath.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/libvirt_private.syms
src/util/virxml.c
src/util/virxml.h

index 27b8e111aacb96356a71a905b4a88fb1fa90c5e6..436d5a07702eb597bd5f2076152f0053377b1ee2 100644 (file)
@@ -3709,6 +3709,7 @@ virXMLFormatMetadata;
 virXMLNewNode;
 virXMLNodeContentString;
 virXMLNodeGetSubelement;
+virXMLNodeGetSubelementList;
 virXMLNodeNameEqual;
 virXMLNodeSanitizeNamespaces;
 virXMLNodeToString;
index e04455fcaafb575cc4f6b9005d9213ecd97623b3..0c1eae8c3c2be615ba7a16dfc39a89a90dfea421 100644 (file)
@@ -899,6 +899,40 @@ virXMLNodeGetSubelement(xmlNodePtr node,
 }
 
 
+/**
+ * virXMLNodeGetSubelementList:
+ * @node: node to get subelement of
+ * @name: name of subelement to fetch (NULL to fetch all sub-elements)
+ * @list: If non-NULL, filled with a list of pointers to the nodes. Caller is
+ *        responsible for freeing the list but not the members.
+ *
+ * Find and return a sub-elements node of @node named @name in a list.
+ * Returns the number of subelements with @name
+ */
+size_t
+virXMLNodeGetSubelementList(xmlNodePtr node,
+                            const char *name,
+                            xmlNodePtr **list)
+{
+    xmlNodePtr n;
+    size_t nelems = 0;
+
+    for (n = node->children; n; n = n->next) {
+        if (n->type == XML_ELEMENT_NODE) {
+            if (name && !virXMLNodeNameEqual(n, name))
+                continue;
+
+            if (list)
+                VIR_APPEND_ELEMENT_COPY(*list, nelems, n);
+            else
+                nelems++;
+        }
+    }
+
+    return nelems;
+}
+
+
 /**
  * virXPathNode:
  * @xpath: the XPath string to evaluate
index cca9f222ab9786f1e6f38e78a27625e4debc4e0c..7af47437bd846bac742337074f82d7043afc7d46 100644 (file)
@@ -77,6 +77,11 @@ xmlNodePtr
 virXMLNodeGetSubelement(xmlNodePtr node,
                         const char *name);
 
+size_t
+virXMLNodeGetSubelementList(xmlNodePtr node,
+                            const char *name,
+                            xmlNodePtr **list);
+
 xmlNodePtr
 virXPathNode(const char *xpath,
              xmlXPathContextPtr ctxt);