mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
src: add 'schema' and 'validate' variable to virXMLParseHelper()
Signed-off-by: Kristina Hanicova <khanicov@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com> Signed-off-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
parent
4de7ccc4d8
commit
f43c27960e
@ -281,7 +281,7 @@ virDomainBackupDefParseString(const char *xmlStr,
|
|||||||
g_autoptr(xmlDoc) xml = NULL;
|
g_autoptr(xmlDoc) xml = NULL;
|
||||||
int keepBlanksDefault = xmlKeepBlanksDefault(0);
|
int keepBlanksDefault = xmlKeepBlanksDefault(0);
|
||||||
|
|
||||||
if ((xml = virXMLParse(NULL, xmlStr, _("(domain_backup)")))) {
|
if ((xml = virXMLParse(NULL, xmlStr, _("(domain_backup)"), NULL, false))) {
|
||||||
xmlKeepBlanksDefault(keepBlanksDefault);
|
xmlKeepBlanksDefault(keepBlanksDefault);
|
||||||
ret = virDomainBackupDefParseNode(xml, xmlDocGetRootElement(xml),
|
ret = virDomainBackupDefParseNode(xml, xmlDocGetRootElement(xml),
|
||||||
xmlopt, flags);
|
xmlopt, flags);
|
||||||
|
@ -226,7 +226,7 @@ virDomainCheckpointDefParseString(const char *xmlStr,
|
|||||||
xmlDocPtr xml;
|
xmlDocPtr xml;
|
||||||
int keepBlanksDefault = xmlKeepBlanksDefault(0);
|
int keepBlanksDefault = xmlKeepBlanksDefault(0);
|
||||||
|
|
||||||
if ((xml = virXMLParse(NULL, xmlStr, _("(domain_checkpoint)")))) {
|
if ((xml = virXMLParse(NULL, xmlStr, _("(domain_checkpoint)"), NULL, false))) {
|
||||||
xmlKeepBlanksDefault(keepBlanksDefault);
|
xmlKeepBlanksDefault(keepBlanksDefault);
|
||||||
ret = virDomainCheckpointDefParseNode(xml, xmlDocGetRootElement(xml),
|
ret = virDomainCheckpointDefParseNode(xml, xmlDocGetRootElement(xml),
|
||||||
xmlopt, parseOpaque, flags);
|
xmlopt, parseOpaque, flags);
|
||||||
|
@ -20400,7 +20400,7 @@ virDomainDefParse(const char *xmlStr,
|
|||||||
virDomainDef *def = NULL;
|
virDomainDef *def = NULL;
|
||||||
int keepBlanksDefault = xmlKeepBlanksDefault(0);
|
int keepBlanksDefault = xmlKeepBlanksDefault(0);
|
||||||
xmlNodePtr root;
|
xmlNodePtr root;
|
||||||
if (!(xml = virXMLParse(filename, xmlStr, _("(domain_definition)"))))
|
if (!(xml = virXMLParse(filename, xmlStr, _("(domain_definition)"), NULL, false)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
root = xmlDocGetRootElement(xml);
|
root = xmlDocGetRootElement(xml);
|
||||||
|
@ -824,7 +824,7 @@ virInterfaceDefParse(const char *xmlStr,
|
|||||||
xmlDocPtr xml;
|
xmlDocPtr xml;
|
||||||
virInterfaceDef *def = NULL;
|
virInterfaceDef *def = NULL;
|
||||||
|
|
||||||
if ((xml = virXMLParse(filename, xmlStr, _("(interface_definition)")))) {
|
if ((xml = virXMLParse(filename, xmlStr, _("(interface_definition)"), NULL, false))) {
|
||||||
def = virInterfaceDefParseNode(xml, xmlDocGetRootElement(xml));
|
def = virInterfaceDefParseNode(xml, xmlDocGetRootElement(xml));
|
||||||
xmlFreeDoc(xml);
|
xmlFreeDoc(xml);
|
||||||
}
|
}
|
||||||
|
@ -2091,7 +2091,7 @@ virNetworkDefParse(const char *xmlStr,
|
|||||||
virNetworkDef *def = NULL;
|
virNetworkDef *def = NULL;
|
||||||
int keepBlanksDefault = xmlKeepBlanksDefault(0);
|
int keepBlanksDefault = xmlKeepBlanksDefault(0);
|
||||||
|
|
||||||
if ((xml = virXMLParse(filename, xmlStr, _("(network_definition)"))))
|
if ((xml = virXMLParse(filename, xmlStr, _("(network_definition)"), NULL, false)))
|
||||||
def = virNetworkDefParseNode(xml, xmlDocGetRootElement(xml), xmlopt);
|
def = virNetworkDefParseNode(xml, xmlDocGetRootElement(xml), xmlopt);
|
||||||
|
|
||||||
xmlKeepBlanksDefault(keepBlanksDefault);
|
xmlKeepBlanksDefault(keepBlanksDefault);
|
||||||
|
@ -2177,7 +2177,7 @@ virNodeDeviceDefParse(const char *str,
|
|||||||
xmlDocPtr xml;
|
xmlDocPtr xml;
|
||||||
g_autoptr(virNodeDeviceDef) def = NULL;
|
g_autoptr(virNodeDeviceDef) def = NULL;
|
||||||
|
|
||||||
if ((xml = virXMLParse(filename, str, _("(node_device_definition)")))) {
|
if ((xml = virXMLParse(filename, str, _("(node_device_definition)"), NULL, false))) {
|
||||||
def = virNodeDeviceDefParseNode(xml, xmlDocGetRootElement(xml),
|
def = virNodeDeviceDefParseNode(xml, xmlDocGetRootElement(xml),
|
||||||
create, virt_type);
|
create, virt_type);
|
||||||
xmlFreeDoc(xml);
|
xmlFreeDoc(xml);
|
||||||
|
@ -2744,7 +2744,7 @@ virNWFilterDefParse(const char *xmlStr,
|
|||||||
virNWFilterDef *def = NULL;
|
virNWFilterDef *def = NULL;
|
||||||
xmlDocPtr xml;
|
xmlDocPtr xml;
|
||||||
|
|
||||||
if ((xml = virXMLParse(filename, xmlStr, _("(nwfilter_definition)")))) {
|
if ((xml = virXMLParse(filename, xmlStr, _("(nwfilter_definition)"), NULL, false))) {
|
||||||
def = virNWFilterDefParseNode(xml, xmlDocGetRootElement(xml));
|
def = virNWFilterDefParseNode(xml, xmlDocGetRootElement(xml));
|
||||||
xmlFreeDoc(xml);
|
xmlFreeDoc(xml);
|
||||||
}
|
}
|
||||||
|
@ -196,7 +196,7 @@ virSecretDefParse(const char *xmlStr,
|
|||||||
xmlDocPtr xml;
|
xmlDocPtr xml;
|
||||||
virSecretDef *ret = NULL;
|
virSecretDef *ret = NULL;
|
||||||
|
|
||||||
if ((xml = virXMLParse(filename, xmlStr, _("(definition_of_secret)")))) {
|
if ((xml = virXMLParse(filename, xmlStr, _("(definition_of_secret)"), NULL, false))) {
|
||||||
ret = secretXMLParseNode(xml, xmlDocGetRootElement(xml));
|
ret = secretXMLParseNode(xml, xmlDocGetRootElement(xml));
|
||||||
xmlFreeDoc(xml);
|
xmlFreeDoc(xml);
|
||||||
}
|
}
|
||||||
|
@ -462,7 +462,7 @@ virDomainSnapshotDefParseString(const char *xmlStr,
|
|||||||
xmlDocPtr xml;
|
xmlDocPtr xml;
|
||||||
int keepBlanksDefault = xmlKeepBlanksDefault(0);
|
int keepBlanksDefault = xmlKeepBlanksDefault(0);
|
||||||
|
|
||||||
if ((xml = virXMLParse(NULL, xmlStr, _("(domain_snapshot)")))) {
|
if ((xml = virXMLParse(NULL, xmlStr, _("(domain_snapshot)"), NULL, false))) {
|
||||||
xmlKeepBlanksDefault(keepBlanksDefault);
|
xmlKeepBlanksDefault(keepBlanksDefault);
|
||||||
ret = virDomainSnapshotDefParseNode(xml, xmlDocGetRootElement(xml),
|
ret = virDomainSnapshotDefParseNode(xml, xmlDocGetRootElement(xml),
|
||||||
xmlopt, parseOpaque,
|
xmlopt, parseOpaque,
|
||||||
|
@ -1009,7 +1009,7 @@ virStoragePoolDefParse(const char *xmlStr,
|
|||||||
virStoragePoolDef *ret = NULL;
|
virStoragePoolDef *ret = NULL;
|
||||||
xmlDocPtr xml;
|
xmlDocPtr xml;
|
||||||
|
|
||||||
if ((xml = virXMLParse(filename, xmlStr, _("(storage_pool_definition)")))) {
|
if ((xml = virXMLParse(filename, xmlStr, _("(storage_pool_definition)"), NULL, false))) {
|
||||||
ret = virStoragePoolDefParseNode(xml, xmlDocGetRootElement(xml));
|
ret = virStoragePoolDefParseNode(xml, xmlDocGetRootElement(xml));
|
||||||
xmlFreeDoc(xml);
|
xmlFreeDoc(xml);
|
||||||
}
|
}
|
||||||
@ -1478,7 +1478,7 @@ virStorageVolDefParse(virStoragePoolDef *pool,
|
|||||||
virStorageVolDef *ret = NULL;
|
virStorageVolDef *ret = NULL;
|
||||||
xmlDocPtr xml;
|
xmlDocPtr xml;
|
||||||
|
|
||||||
if ((xml = virXMLParse(filename, xmlStr, _("(storage_volume_definition)")))) {
|
if ((xml = virXMLParse(filename, xmlStr, _("(storage_volume_definition)"), NULL, false))) {
|
||||||
ret = virStorageVolDefParseNode(pool, xml, xmlDocGetRootElement(xml), flags);
|
ret = virStorageVolDefParseNode(pool, xml, xmlDocGetRootElement(xml), flags);
|
||||||
xmlFreeDoc(xml);
|
xmlFreeDoc(xml);
|
||||||
}
|
}
|
||||||
|
@ -297,7 +297,7 @@ virNetworkPortDefParse(const char *xmlStr,
|
|||||||
virNetworkPortDef *def = NULL;
|
virNetworkPortDef *def = NULL;
|
||||||
xmlDocPtr xml;
|
xmlDocPtr xml;
|
||||||
|
|
||||||
if ((xml = virXMLParse(filename, xmlStr, _("(networkport_definition)")))) {
|
if ((xml = virXMLParse(filename, xmlStr, _("(networkport_definition)"), NULL, false))) {
|
||||||
def = virNetworkPortDefParseNode(xml, xmlDocGetRootElement(xml));
|
def = virNetworkPortDefParseNode(xml, xmlDocGetRootElement(xml));
|
||||||
xmlFreeDoc(xml);
|
xmlFreeDoc(xml);
|
||||||
}
|
}
|
||||||
|
@ -188,7 +188,7 @@ virNWFilterBindingDefParse(const char *xmlStr,
|
|||||||
virNWFilterBindingDef *def = NULL;
|
virNWFilterBindingDef *def = NULL;
|
||||||
xmlDocPtr xml;
|
xmlDocPtr xml;
|
||||||
|
|
||||||
if ((xml = virXMLParse(filename, xmlStr, _("(nwfilterbinding_definition)")))) {
|
if ((xml = virXMLParse(filename, xmlStr, _("(nwfilterbinding_definition)"), NULL, false))) {
|
||||||
def = virNWFilterBindingDefParseNode(xml, xmlDocGetRootElement(xml));
|
def = virNWFilterBindingDefParseNode(xml, xmlDocGetRootElement(xml));
|
||||||
xmlFreeDoc(xml);
|
xmlFreeDoc(xml);
|
||||||
}
|
}
|
||||||
|
@ -265,7 +265,7 @@ virNWFilterBindingObjParse(const char *xmlStr,
|
|||||||
virNWFilterBindingObj *obj = NULL;
|
virNWFilterBindingObj *obj = NULL;
|
||||||
xmlDocPtr xml;
|
xmlDocPtr xml;
|
||||||
|
|
||||||
if ((xml = virXMLParse(filename, xmlStr, _("(nwfilterbinding_status)")))) {
|
if ((xml = virXMLParse(filename, xmlStr, _("(nwfilterbinding_status)"), NULL, false))) {
|
||||||
obj = virNWFilterBindingObjParseNode(xml, xmlDocGetRootElement(xml));
|
obj = virNWFilterBindingObjParseNode(xml, xmlDocGetRootElement(xml));
|
||||||
xmlFreeDoc(xml);
|
xmlFreeDoc(xml);
|
||||||
}
|
}
|
||||||
|
@ -832,7 +832,7 @@ testParseXMLDocFromFile(xmlNodePtr node, const char *file, const char *type)
|
|||||||
if ((relFile = virXMLPropString(node, "file"))) {
|
if ((relFile = virXMLPropString(node, "file"))) {
|
||||||
absFile = testBuildFilename(file, relFile);
|
absFile = testBuildFilename(file, relFile);
|
||||||
|
|
||||||
if (!(doc = virXMLParse(absFile, NULL, type)))
|
if (!(doc = virXMLParse(absFile, NULL, type, NULL, false)))
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
ret = xmlCopyNode(xmlDocGetRootElement(doc), 1);
|
ret = xmlCopyNode(xmlDocGetRootElement(doc), 1);
|
||||||
|
@ -1096,6 +1096,8 @@ catchXMLError(void *ctx, const char *msg G_GNUC_UNUSED, ...)
|
|||||||
* @url: URL of XML document for string parser
|
* @url: URL of XML document for string parser
|
||||||
* @rootelement: Optional name of the expected root element
|
* @rootelement: Optional name of the expected root element
|
||||||
* @ctxt: optional pointer to populate with new context pointer
|
* @ctxt: optional pointer to populate with new context pointer
|
||||||
|
* @schemafile: unused
|
||||||
|
* @validate: unused
|
||||||
*
|
*
|
||||||
* Parse XML document provided either as a file or a string. The function
|
* Parse XML document provided either as a file or a string. The function
|
||||||
* guarantees that the XML document contains a root element.
|
* guarantees that the XML document contains a root element.
|
||||||
@ -1111,7 +1113,9 @@ virXMLParseHelper(int domcode,
|
|||||||
const char *xmlStr,
|
const char *xmlStr,
|
||||||
const char *url,
|
const char *url,
|
||||||
const char *rootelement,
|
const char *rootelement,
|
||||||
xmlXPathContextPtr *ctxt)
|
xmlXPathContextPtr *ctxt,
|
||||||
|
const char *schemafile G_GNUC_UNUSED,
|
||||||
|
bool validate G_GNUC_UNUSED)
|
||||||
{
|
{
|
||||||
struct virParserData private;
|
struct virParserData private;
|
||||||
g_autoptr(xmlParserCtxt) pctxt = NULL;
|
g_autoptr(xmlParserCtxt) pctxt = NULL;
|
||||||
|
@ -170,7 +170,9 @@ virXMLParseHelper(int domcode,
|
|||||||
const char *xmlStr,
|
const char *xmlStr,
|
||||||
const char *url,
|
const char *url,
|
||||||
const char *rootelement,
|
const char *rootelement,
|
||||||
xmlXPathContextPtr *ctxt);
|
xmlXPathContextPtr *ctxt,
|
||||||
|
const char *schemafile,
|
||||||
|
bool validate);
|
||||||
|
|
||||||
const char *
|
const char *
|
||||||
virXMLPickShellSafeComment(const char *str1,
|
virXMLPickShellSafeComment(const char *str1,
|
||||||
@ -185,8 +187,8 @@ virXMLPickShellSafeComment(const char *str1,
|
|||||||
*
|
*
|
||||||
* Return the parsed document object, or NULL on failure.
|
* Return the parsed document object, or NULL on failure.
|
||||||
*/
|
*/
|
||||||
#define virXMLParse(filename, xmlStr, url) \
|
#define virXMLParse(filename, xmlStr, url, schemafile, validate) \
|
||||||
virXMLParseHelper(VIR_FROM_THIS, filename, xmlStr, url, NULL, NULL)
|
virXMLParseHelper(VIR_FROM_THIS, filename, xmlStr, url, NULL, NULL, schemafile, validate)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* virXMLParseString:
|
* virXMLParseString:
|
||||||
@ -198,7 +200,7 @@ virXMLPickShellSafeComment(const char *str1,
|
|||||||
* Return the parsed document object, or NULL on failure.
|
* Return the parsed document object, or NULL on failure.
|
||||||
*/
|
*/
|
||||||
#define virXMLParseString(xmlStr, url) \
|
#define virXMLParseString(xmlStr, url) \
|
||||||
virXMLParseHelper(VIR_FROM_THIS, NULL, xmlStr, url, NULL, NULL)
|
virXMLParseHelper(VIR_FROM_THIS, NULL, xmlStr, url, NULL, NULL, NULL, false)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* virXMLParseFile:
|
* virXMLParseFile:
|
||||||
@ -209,7 +211,7 @@ virXMLPickShellSafeComment(const char *str1,
|
|||||||
* Return the parsed document object, or NULL on failure.
|
* Return the parsed document object, or NULL on failure.
|
||||||
*/
|
*/
|
||||||
#define virXMLParseFile(filename) \
|
#define virXMLParseFile(filename) \
|
||||||
virXMLParseHelper(VIR_FROM_THIS, filename, NULL, NULL, NULL, NULL)
|
virXMLParseHelper(VIR_FROM_THIS, filename, NULL, NULL, NULL, NULL, NULL, false)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* virXMLParseCtxt:
|
* virXMLParseCtxt:
|
||||||
@ -224,7 +226,7 @@ virXMLPickShellSafeComment(const char *str1,
|
|||||||
* Return the parsed document object, or NULL on failure.
|
* Return the parsed document object, or NULL on failure.
|
||||||
*/
|
*/
|
||||||
#define virXMLParseCtxt(filename, xmlStr, url, pctxt) \
|
#define virXMLParseCtxt(filename, xmlStr, url, pctxt) \
|
||||||
virXMLParseHelper(VIR_FROM_THIS, filename, xmlStr, url, NULL, pctxt)
|
virXMLParseHelper(VIR_FROM_THIS, filename, xmlStr, url, NULL, pctxt, NULL, false)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* virXMLParseStringCtxt:
|
* virXMLParseStringCtxt:
|
||||||
@ -238,11 +240,11 @@ virXMLPickShellSafeComment(const char *str1,
|
|||||||
* Return the parsed document object, or NULL on failure.
|
* Return the parsed document object, or NULL on failure.
|
||||||
*/
|
*/
|
||||||
#define virXMLParseStringCtxt(xmlStr, url, pctxt) \
|
#define virXMLParseStringCtxt(xmlStr, url, pctxt) \
|
||||||
virXMLParseHelper(VIR_FROM_THIS, NULL, xmlStr, url, NULL, pctxt)
|
virXMLParseHelper(VIR_FROM_THIS, NULL, xmlStr, url, NULL, pctxt, NULL, false)
|
||||||
|
|
||||||
/* virXMLParseStringCtxtRoot is same as above, except it also validates root node name */
|
/* virXMLParseStringCtxtRoot is same as above, except it also validates root node name */
|
||||||
#define virXMLParseStringCtxtRoot(xmlStr, url, rootnode, pctxt) \
|
#define virXMLParseStringCtxtRoot(xmlStr, url, rootnode, pctxt) \
|
||||||
virXMLParseHelper(VIR_FROM_THIS, NULL, xmlStr, url, rootnode, pctxt)
|
virXMLParseHelper(VIR_FROM_THIS, NULL, xmlStr, url, rootnode, pctxt, NULL, false)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* virXMLParseFileCtxt:
|
* virXMLParseFileCtxt:
|
||||||
@ -255,7 +257,7 @@ virXMLPickShellSafeComment(const char *str1,
|
|||||||
* Return the parsed document object, or NULL on failure.
|
* Return the parsed document object, or NULL on failure.
|
||||||
*/
|
*/
|
||||||
#define virXMLParseFileCtxt(filename, pctxt) \
|
#define virXMLParseFileCtxt(filename, pctxt) \
|
||||||
virXMLParseHelper(VIR_FROM_THIS, filename, NULL, NULL, NULL, pctxt)
|
virXMLParseHelper(VIR_FROM_THIS, filename, NULL, NULL, NULL, pctxt, NULL, false)
|
||||||
|
|
||||||
int
|
int
|
||||||
virXMLSaveFile(const char *path,
|
virXMLSaveFile(const char *path,
|
||||||
|
@ -593,7 +593,7 @@ virVBoxSnapshotConfLoadVboxFile(const char *filePath,
|
|||||||
|
|
||||||
machineDescription = g_new0(virVBoxSnapshotConfMachine, 1);
|
machineDescription = g_new0(virVBoxSnapshotConfMachine, 1);
|
||||||
|
|
||||||
xml = virXMLParse(filePath, NULL, NULL);
|
xml = virXMLParse(filePath, NULL, NULL, NULL, false);
|
||||||
if (xml == NULL) {
|
if (xml == NULL) {
|
||||||
virReportError(VIR_ERR_XML_ERROR, "%s",
|
virReportError(VIR_ERR_XML_ERROR, "%s",
|
||||||
_("Unable to parse the xml"));
|
_("Unable to parse the xml"));
|
||||||
@ -1230,7 +1230,7 @@ virVBoxSnapshotConfGetRWDisksPathsFromLibvirtXML(const char *filePath,
|
|||||||
_("filePath is null"));
|
_("filePath is null"));
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
xml = virXMLParse(filePath, NULL, NULL);
|
xml = virXMLParse(filePath, NULL, NULL, NULL, false);
|
||||||
if (xml == NULL) {
|
if (xml == NULL) {
|
||||||
virReportError(VIR_ERR_XML_ERROR, "%s",
|
virReportError(VIR_ERR_XML_ERROR, "%s",
|
||||||
_("Unable to parse the xml"));
|
_("Unable to parse the xml"));
|
||||||
@ -1292,7 +1292,7 @@ virVBoxSnapshotConfGetRODisksPathsFromLibvirtXML(const char *filePath,
|
|||||||
_("filePath is null"));
|
_("filePath is null"));
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
xml = virXMLParse(filePath, NULL, NULL);
|
xml = virXMLParse(filePath, NULL, NULL, NULL, false);
|
||||||
if (xml == NULL) {
|
if (xml == NULL) {
|
||||||
virReportError(VIR_ERR_XML_ERROR, "%s",
|
virReportError(VIR_ERR_XML_ERROR, "%s",
|
||||||
_("Unable to parse the xml"));
|
_("Unable to parse the xml"));
|
||||||
|
@ -4595,7 +4595,7 @@ prlsdkParseSnapshotTree(const char *treexml)
|
|||||||
if (*treexml == '\0')
|
if (*treexml == '\0')
|
||||||
return snapshots;
|
return snapshots;
|
||||||
|
|
||||||
if (!(xml = virXMLParse(NULL, treexml, _("(snapshot_tree)"))))
|
if (!(xml = virXMLParse(NULL, treexml, _("(snapshot_tree)"), NULL, false)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
root = xmlDocGetRootElement(xml);
|
root = xmlDocGetRootElement(xml);
|
||||||
|
@ -678,7 +678,7 @@ testCompareXMLToArgv(const void *data)
|
|||||||
if (testCheckExclusiveFlags(info->flags) < 0)
|
if (testCheckExclusiveFlags(info->flags) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (!(xml = virXMLParse(info->infile, NULL, "(domain_definition)")))
|
if (!(xml = virXMLParse(info->infile, NULL, "(domain_definition)", NULL, false)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
root = xmlDocGetRootElement(xml);
|
root = xmlDocGetRootElement(xml);
|
||||||
|
Loading…
Reference in New Issue
Block a user