【发布时间】:2018-11-22 07:50:06
【问题描述】:
我有一些基于非常简单的字符串以不同方式创建 XML 的代码。有谁知道为什么?
首先,代码 sn-p (澄清 @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(带有 CDATA 的 Pql 标记):
<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 < '50' AND userFieldAmount1 = '4001166' AND relatedQueryPurchaseOrder.orderStatus < '40' ) ORDER BY order,line,release" domainClass="com.mapics.pm.PoItemRelease" includeMetaData="true" maxReturned="1" name="queryListPurchaseOrderItemRelease_SLTOKEN"/>
这两行代码的唯一区别是,有效的是AND remainingQuantityForReleaseStockingUm > 0.000
那么为什么这会影响生成的 XML?
【问题讨论】:
-
您忘记包含代码了。
-
我提供的是问题代码sn-p,即有问题的确切代码。我还能提供什么帮助?我试图不使用大量代码来解决问题,保持简单。
-
该代码只是一个更新数据结构的赋值。您没有描述如何将数据结构转换为 XML 文档。您甚至没有描述您正在使用的众多可用 XML 模块中的哪一个。
-
完成。我不明白的是,为什么简单地将“AND remainingQuantityForReleaseStockingUm > 0.000”添加到作业中会修复生成的 XML。希望我提供了足够的信息。