如何在 Oracle DBMS_XMLDOM 中更改 XML 元素的名称?
How can I change the name of an XML element in Oracle DBMS_XMLDOM?
在编写将一些现有 XMLTYPE
数据组合到另一个 XML 文档中的函数时,我需要重命名插入数据的文档元素。查看 DBMS_XMLDOM documentation 似乎只有一个 GetNodeName
函数来读取元素名称,但没有 SetNodeName
函数来更改元素名称。
如何在使用 DBMS_XMLDOM 时更改 XML 元素的名称?还是只有回退到 XSL 转换才有可能?
最小化 PL/SQL 示例:
DECLARE
v_ResultDoc XmlDom.DomDocument;
v_ResultXml XMLTYPE;
v_ResultNode XmlDom.DomNode;
v_ClientDoc XmlDom.DomDocument;
v_ClientXml XMLTYPE;
v_Node XmlDom.DomNode;
BEGIN
v_ResultDoc := XmlDom.NewDomDocument('<Result/>');
v_ResultNode := XmlDom.MakeNode(XmlDom.GetDocumentElement(v_ResultDoc));
v_ClientXml := XMLTYPE('<Foo>Some data generated by another function</Foo>');
v_ClientDoc := XmlDom.NewDomDocument(v_ClientXml);
v_Node := XmlDom.MakeNode(XmlDom.GetDocumentElement(v_ClientDoc));
v_Node := XmlDom.AppendChild(v_ResultNode, XmlDom.AdoptNode(v_ResultDoc, v_Node));
XmlDom.FreeDocument(v_ClientDoc);
-- TODO: modify XML to <Result><Bar>Some data generated by another function</Bar></Result>
v_ResultXml := XmlDom.GetXmlType(v_ResultDoc);
XmlDom.FreeDocument(v_ResultDoc);
END;
似乎没有 DBMS_XMLDOM 重命名元素名称的功能,唯一的选择(不回退到 XSL)是生成一个新的父元素,遍历所有子节点,并将它们移动到新的父节点:
DECLARE
v_ResultDoc XmlDom.DomDocument;
v_ResultXml XMLTYPE;
v_ResultNode XmlDom.DomNode;
v_ClientDoc XmlDom.DomDocument;
v_ClientXml XMLTYPE;
v_ClientNode XmlDom.DomNode;
v_NodeList XmlDom.DomNodeList;
v_Node XmlDom.DomNode;
i INT;
BEGIN
v_ResultDoc := XmlDom.NewDomDocument('<Result/>');
v_ResultNode := XmlDom.MakeNode(XmlDom.GetDocumentElement(v_ResultDoc));
v_ClientXml := XMLTYPE('<Foo>Some data generated by another function</Foo>');
v_ClientDoc := XmlDom.NewDomDocument(v_ClientXml);
v_ClientNode := XmlDom.AppendChild(v_ResultNode,
XmlDom.MakeNode(XmlDom.CreateElement(v_ResultDoc, 'Bar')));
v_Node := XmlDom.MakeNode(XmlDom.GetDocumentElement(v_ClientDoc));
v_NodeList := XmlDom.GetChildNodes(v_Node);
FOR i IN 0..XmlDom.GetLength(v_NodeList)-1 LOOP
v_Node := XmlDom.Item(v_NodeList, i);
v_Node := XmlDom.AppendChild(v_ClientNode,
XmlDom.AdoptNode(v_ResultDoc, v_Node));
END LOOP;
XmlDom.FreeDocument(v_ClientDoc);
v_ResultXml := XmlDom.GetXmlType(v_ResultDoc);
XmlDom.FreeDocument(v_ResultDoc);
-- do something with v_ResultXml ...
END;
在编写将一些现有 XMLTYPE
数据组合到另一个 XML 文档中的函数时,我需要重命名插入数据的文档元素。查看 DBMS_XMLDOM documentation 似乎只有一个 GetNodeName
函数来读取元素名称,但没有 SetNodeName
函数来更改元素名称。
如何在使用 DBMS_XMLDOM 时更改 XML 元素的名称?还是只有回退到 XSL 转换才有可能?
最小化 PL/SQL 示例:
DECLARE
v_ResultDoc XmlDom.DomDocument;
v_ResultXml XMLTYPE;
v_ResultNode XmlDom.DomNode;
v_ClientDoc XmlDom.DomDocument;
v_ClientXml XMLTYPE;
v_Node XmlDom.DomNode;
BEGIN
v_ResultDoc := XmlDom.NewDomDocument('<Result/>');
v_ResultNode := XmlDom.MakeNode(XmlDom.GetDocumentElement(v_ResultDoc));
v_ClientXml := XMLTYPE('<Foo>Some data generated by another function</Foo>');
v_ClientDoc := XmlDom.NewDomDocument(v_ClientXml);
v_Node := XmlDom.MakeNode(XmlDom.GetDocumentElement(v_ClientDoc));
v_Node := XmlDom.AppendChild(v_ResultNode, XmlDom.AdoptNode(v_ResultDoc, v_Node));
XmlDom.FreeDocument(v_ClientDoc);
-- TODO: modify XML to <Result><Bar>Some data generated by another function</Bar></Result>
v_ResultXml := XmlDom.GetXmlType(v_ResultDoc);
XmlDom.FreeDocument(v_ResultDoc);
END;
似乎没有 DBMS_XMLDOM 重命名元素名称的功能,唯一的选择(不回退到 XSL)是生成一个新的父元素,遍历所有子节点,并将它们移动到新的父节点:
DECLARE
v_ResultDoc XmlDom.DomDocument;
v_ResultXml XMLTYPE;
v_ResultNode XmlDom.DomNode;
v_ClientDoc XmlDom.DomDocument;
v_ClientXml XMLTYPE;
v_ClientNode XmlDom.DomNode;
v_NodeList XmlDom.DomNodeList;
v_Node XmlDom.DomNode;
i INT;
BEGIN
v_ResultDoc := XmlDom.NewDomDocument('<Result/>');
v_ResultNode := XmlDom.MakeNode(XmlDom.GetDocumentElement(v_ResultDoc));
v_ClientXml := XMLTYPE('<Foo>Some data generated by another function</Foo>');
v_ClientDoc := XmlDom.NewDomDocument(v_ClientXml);
v_ClientNode := XmlDom.AppendChild(v_ResultNode,
XmlDom.MakeNode(XmlDom.CreateElement(v_ResultDoc, 'Bar')));
v_Node := XmlDom.MakeNode(XmlDom.GetDocumentElement(v_ClientDoc));
v_NodeList := XmlDom.GetChildNodes(v_Node);
FOR i IN 0..XmlDom.GetLength(v_NodeList)-1 LOOP
v_Node := XmlDom.Item(v_NodeList, i);
v_Node := XmlDom.AppendChild(v_ClientNode,
XmlDom.AdoptNode(v_ResultDoc, v_Node));
END LOOP;
XmlDom.FreeDocument(v_ClientDoc);
v_ResultXml := XmlDom.GetXmlType(v_ResultDoc);
XmlDom.FreeDocument(v_ResultDoc);
-- do something with v_ResultXml ...
END;