Как предотвратить переформатирование XML в SQL - PullRequest
0 голосов
/ 08 октября 2018

Обновлен XML-файл для удаления ненужного поля с использованием deletexml(xmltype(xxx)).getClobVal(), но XML возвращается в виде одной длинной строки вместо правильно отформатированного XML-файла с отступами и пробелами.Есть идеи, что я здесь делаю не так?Спасибо

Ответы [ 3 ]

0 голосов
/ 08 октября 2018

getClobVal, getStringVal устарели, поскольку oracle 11.2. Вместо этих функций вы должны использовать xmlserialize.

Пример:

 select xmlserialize(document xmltype('<a><b><c>xxx</c></b></a>') indent size=2) from dual; 

И вы закончите с объектом clob, содержащим pretty-print xml.

0 голосов
/ 09 октября 2018

Я использую эту процедуру для создания красивого XML:

PROCEDURE MakePrettyXml(xmlString IN OUT NOCOPY CLOB) IS

    xmlDocFragment DBMS_XMLDOM.DOMDOCUMENTFRAGMENT;
    xslProc DBMS_XSLPROCESSOR.PROCESSOR;
    xsl DBMS_XSLPROCESSOR.STYLESHEET;
    xmlStringOut CLOB;

BEGIN

    DBMS_LOB.CREATETEMPORARY(xmlStringOut, TRUE);
    xslProc := DBMS_XSLPROCESSOR.NEWPROCESSOR; 
    xsl := DBMS_XSLPROCESSOR.NEWSTYLESHEET(
        '<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">'||
            '<xsl:output method="xml" indent="yes"/>'||
            '<xsl:template match="@*|node( )">'||
                '<xsl:copy>'||
                    '<xsl:apply-templates select="@*|node( )"/>'||
                '</xsl:copy>'||
            '</xsl:template>'||
        '</xsl:stylesheet>', NULL);

    xmlDocFragment := DBMS_XSLPROCESSOR.PROCESSXSL(p => xslProc, ss => xsl, cl => xmlString);
    DBMS_XMLDOM.WRITETOCLOB(DBMS_XMLDOM.MAKENODE(xmlDocFragment), xmlStringOut);

    DBMS_XSLPROCESSOR.FREESTYLESHEET(xsl);
    DBMS_XSLPROCESSOR.FREEPROCESSOR(xslProc);

    xmlString := xmlStringOut; 
    DBMS_LOB.FREETEMPORARY(xmlStringOut);

END MakePrettyXml;

Но обратите внимание, что вывод будет CLOB, а не XMLTYPE, вам могут потребоваться некоторые дополнительные преобразования.

0 голосов
/ 08 октября 2018

"правильно отформатированный XML-файл с отступами и пробелами"

Это может вас удивить, но это правильно отформатированный (правильно сформированный) XML.Стандарт XML ничего не говорит о пробелах между структурными элементами, за исключением того, что это разрешено.По какой-то причине он называется «незначительный пробел».

Если вы хотите отформатировать XML для удобства чтения, вы должны сделать это самостоятельно.Но XML не для людей, а для машин, поэтому нет никакой причины, чтобы ваш SQL выполнял такое форматирование.Используйте любой инструмент, который вам нравится, который автоматически форматирует XML для удобства чтения, если вы хотите проверить XML как человека.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...