提交 b874f26b 编写于 作者: L Laine Stump

util: new function virXMLNodeSanitizeNamespaces()

This is a generic version of virDomainDefMetadataSanitize() - the same
functionality is now needed for network metadata.
上级 328fccf1
......@@ -3645,59 +3645,6 @@ virDomainDefRejectDuplicatePanics(virDomainDefPtr def)
return 0;
}
/**
* virDomainDefMetadataSanitize:
* @def: Sanitize metadata for this def
*
* This function removes metadata elements in @def that share the namespace.
* The first metadata entry of every duplicate namespace is kept. Additionally
* elements with no namespace are deleted.
*/
static void
virDomainDefMetadataSanitize(virDomainDefPtr def)
{
xmlNodePtr child;
xmlNodePtr next;
xmlNodePtr dupl;
if (!def || !def->metadata)
return;
child = def->metadata->children;
while (child) {
/* remove metadata entries that don't have any namespace at all */
if (!child->ns || !child->ns->href) {
dupl = child;
child = child->next;
xmlUnlinkNode(dupl);
xmlFreeNode(dupl);
continue;
}
/* check that every other child of @root doesn't share the namespace of
* the current one and delete them possibly */
next = child->next;
while (next) {
dupl = NULL;
if (child->ns && next->ns &&
STREQ_NULLABLE((const char *) child->ns->href,
(const char *) next->ns->href))
dupl = next;
next = next->next;
if (dupl) {
xmlUnlinkNode(dupl);
xmlFreeNode(dupl);
}
}
child = child->next;
}
}
static int
virDomainDefPostParseMemory(virDomainDefPtr def,
......@@ -4496,7 +4443,7 @@ virDomainDefPostParseInternal(virDomainDefPtr def,
}
/* clean up possibly duplicated metadata entries */
virDomainDefMetadataSanitize(def);
virXMLNodeSanitizeNamespaces(def->metadata);
virDomainDefPostParseGraphics(def);
......
......@@ -2602,6 +2602,7 @@ virUUIDParse;
# util/virxml.h
virXMLChildElementCount;
virXMLExtractNamespaceXML;
virXMLNodeSanitizeNamespaces;
virXMLNodeToString;
virXMLParseHelper;
virXMLPickShellSafeComment;
......
......@@ -1083,6 +1083,58 @@ virXMLInjectNamespace(xmlNodePtr node,
return 0;
}
/**
* virXMLNodeSanitizeNamespaces()
* @node: Sanitize the namespaces for this node
*
* This function removes subnodes in node that share the namespace.
* The first instance of every duplicate namespace is kept.
* Additionally nodes with no namespace are deleted.
*/
void
virXMLNodeSanitizeNamespaces(xmlNodePtr node)
{
xmlNodePtr child;
xmlNodePtr next;
xmlNodePtr dupl;
if (!node)
return;
child = node->children;
while (child) {
/* remove subelements that don't have any namespace at all */
if (!child->ns || !child->ns->href) {
dupl = child;
child = child->next;
xmlUnlinkNode(dupl);
xmlFreeNode(dupl);
continue;
}
/* check that every other child of @root doesn't share the namespace of
* the current one and delete them possibly */
next = child->next;
while (next) {
dupl = NULL;
if (child->ns && next->ns &&
STREQ_NULLABLE((const char *) child->ns->href,
(const char *) next->ns->href))
dupl = next;
next = next->next;
if (dupl) {
xmlUnlinkNode(dupl);
xmlFreeNode(dupl);
}
}
child = child->next;
}
}
static void catchRNGError(void *ctx,
const char *msg,
...)
......
......@@ -179,6 +179,8 @@ int virXMLInjectNamespace(xmlNodePtr node,
const char *uri,
const char *key);
void virXMLNodeSanitizeNamespaces(xmlNodePtr node);
struct _virXMLValidator {
xmlRelaxNGParserCtxtPtr rngParser;
xmlRelaxNGPtr rng;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册