Проблема с настройкой тега perl XML - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть код, который по-разному создает XML на основе очень простой строки символов.Кто-нибудь знает почему?

Прежде всего, фрагмент кода (чтобы прояснить ситуацию для @mob) со строками Вокруг проблемной строки:

my $XML = XML::Smart->new();

my $mylogin = {
    userId => $SQLUser,
    password => $SQLPass,
    maxIdle => '900000',
    properties => '<hidden for privacy concerns>'
};
$XML->{'System-Link'}{Login} = $mylogin;

my $request = {
    sessionHandle => '*current',
    workHandle => '*new',
    broker => 'EJB',
    maxIdle => '900000'
};
$XML->{'System-Link'}{Request} = $request;

my $querylist = {
    name => 'queryListPurchaseOrderItemRelease_SLTOKEN',
    domainClass => '<hidden for privacy concerns>',
    includeMetaData => 'true',
    maxReturned => '1'
};
$XML->{'System-Link'}{Request}{QueryList} = $querylist;
### PROBLEM LINE GOES HERE, just subsitute one of below lines here

## Muck with the DTD cause 'EMPTY' causes problems, this is an issue w/ the implementation of XML::Smart
open $dtd, '<', 'SystemLinkRequest.dtd';
my $dtdContent = do { local $/; <$dtd> };
close $dtd;
$dtdContent =~ s/EMPTY//g;

$XML->apply_dtd($dtdContent);

## Turn off output of DTD and meta tag generation
my $xmldata = $XML->data(nometagen => 1, nodtd => 1);
$xmldata =~ s/\?>/?>\n<!DOCTYPE System-Link SYSTEM 'SystemLinkRequest.dtd'>/m;
## Store a clean version (no passwords) in the local XML file
my $xmldata_clean = $xmldata;
$xmldata_clean =~ s/userId\s*=\s*\"$SQLUser\"\s+password\s*=\s*\"$SQLPass\"/userId=\"REMOVED\" password=\"REMOVED\"/g;

my $xml_filename = $RELEASE . "-" . time . ".xml";
print LOGF "{DEBUG} [" . localtime(time) . "] \tBuilding XML Request COMPLETED\n";
print LOGF "{DEBUG} [" . localtime(time) . "] \tWriting XML Request to Request_$xml_filename STARTED\n";

open $RequestLogfile, '>', "$logsDir/XML/Update/Request_$xml_filename";
print $RequestLogfile "\n--------------- QUERY REQUEST ---------------\n";
print $RequestLogfile $xmldata;
close $RequestLogfile;

Работает:

$XML->{'System-Link'}{Request}{QueryList}{Pql} = "SELECT order,line,item,release,dueToDockDate,dueToStockDate,userFieldAmount1 WHERE (releaseStatus < '50' AND userFieldAmount1 = '$RELEASE' AND relatedQueryPurchaseOrder.orderStatus < '40' AND remainingQuantityForReleaseStockingUm > 0.000) ORDER BY order,line,release";

Не работает:

$XML->{'System-Link'}{Request}{QueryList}{Pql} = "SELECT order,line,item,release,dueToDockDate,dueToStockDate,userFieldAmount1 WHERE (releaseStatus < '50' AND userFieldAmount1 = '$RELEASE' AND relatedQueryPurchaseOrder.orderStatus < '40') ORDER BY order,line,release";

Теперь я получаю XML.

Хороший XML (тег Pql с CDATA):

<QueryList domainClass="com.mapics.pm.PoItemRelease" includeMetaData="true" maxReturned="1" name="queryListPurchaseOrderItemRelease_SLTOKEN">
<Pql><![CDATA[SELECT order,line,item,release,dueToDockDate,dueToStockDate,userFieldAmount1 WHERE (releaseStatus < '50' AND userFieldAmount1 = '4001166' AND relatedQueryPurchaseOrder.orderStatus < '40' AND remainingQuantityForReleaseStockingUm > 0.000) ORDER BY order,line,release]]></Pql>
</QueryList>

Неверный XML (атрибут Pql):

<QueryList Pql="SELECT order,line,item,release,dueToDockDate,dueToStockDate,userFieldAmount1 WHERE (releaseStatus &lt; '50' AND userFieldAmount1 = '4001166' AND relatedQueryPurchaseOrder.orderStatus &lt; '40' ) ORDER BY order,line,release" domainClass="com.mapics.pm.PoItemRelease" includeMetaData="true" maxReturned="1" name="queryListPurchaseOrderItemRelease_SLTOKEN"/>

Единственное различие между двумя строками кода состоит в том, что работающая строка имеет AND remainingQuantityForReleaseStockingUm > 0.000

Так почему же это влияет на итоговый XML?

1 Ответ

0 голосов
/ 22 ноября 2018

XML::Smart::_data_type содержит этот код:

  return 3 if( $data && $data =~ /<.*?>/s    ) ;

, где тип данных "3" указывает, что элемент XML должен быть представлен как CDATA.Если это «хороший XML», это только при случайном случае.

Я думаю, вы могли бы обмануть XML::Smart, чтобы отобразить все ваши SQL-запросы как CDATA с дополнительным предложением, таким как

SELECT ... WHERE (... AND ... AND 1<>0) ORDER BY ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...