Alta varianta:
Function RemoveNamespaces
LParameters lcXML
Local loXml, loNewXML, loRoot, loNode, loNodes, lcResult, lcRootName
loXml = CreateObject("MSXML2.DOMDocument.6.0")
loXml.LoadXML(lcXML)
loXml.setProperty("SelectionLanguage", "XPath")
loNewXML = CreateObject("MSXML2.DOMDocument.6.0")
loNewXML.preserveWhiteSpace = .F.
loNewXML.AppendChild(loNewXML.createProcessingInstruction("xml", 'version="1.0"'))
* Get the root element name without namespace
lcRootName = IIf(At(":", loXml.documentElement.NodeName) > 0, SubStr(loXml.documentElement.NodeName, At(":", loXml.documentElement.NodeName) + 1), loXml.documentElement.NodeName)
* Create a new root element with the same name
loRoot = loNewXML.CreateElement(lcRootName)
loNewXML.AppendChild(loRoot)
* Copy nodes without namespaces
loNodes = loXml.documentElement.ChildNodes
For Each loNode In loNodes
AddNodeWithoutNamespace(loRoot, loNode)
EndFor
*loNewXML.formatting = 1 && Enable pretty print
*lcResult = loNewXML.XML
If Not File("prettyprint.xslt")
Text To lcSQL NoShow TextMerge
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="
http://www.w3.org/1999/XSL/Transform" xmlns:xalan="
http://xml.apache.org/xslt" version="1.0">
<xsl:output method="xml" encoding="UTF-8" indent="yes" xalan:indent-amount="4"/>
<!--Important! Remove existing whitespace in DOM elements.-->
<xsl:strip-space elements="*"/>
<!--Identity transformation (see
http://www.w3.org/TR/xslt#copying).-->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
EndText
EndIf
* Apply XSLT for pretty print
loXSLT = CREATEOBJECT("MSXML2.FreeThreadedDOMDocument.6.0")
loXSLT.async = .F.
loXSLT.load("prettyprint.xslt")
loTransformedXML = CREATEOBJECT("MSXML2.DOMDocument.6.0")
loNewXML.transformNodeToObject(loXSLT, loTransformedXML)
lcResult = loTransformedXML.XML
Return lcResult
EndFunc
* __________________________________________________________________________________________________________
Procedure AddNodeWithoutNamespace
LParameters loParent, loNode
Local loNewNode, loChildNode, lcNodeName
If loNode.NodeType = 1 && Element node
* Remove prefix from node name
lcNodeName = IIf(At(":", loNode.NodeName) > 0, SubStr(loNode.NodeName, At(":", loNode.NodeName) + 1), loNode.NodeName)
loNewNode = loParent.ownerDocument.CreateNode(1, lcNodeName, "")
loParent.AppendChild(loNewNode)
For Each loChildNode In loNode.ChildNodes
AddNodeWithoutNamespace(loNewNode, loChildNode)
EndFor
Else
If loNode.NodeType = 3 && Text node
loNewNode = loParent.ownerDocument.createTextNode(loNode.nodeValue)
loParent.AppendChild(loNewNode)
EndIf
EndIf
EndProc
* __________________________________________________________________________________________________________