【问题标题】:perl XML setting tag value issueperl XML设置标签值问题
【发布时间】: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-&gt;{'System-Link'}{Request}{QueryList}{Pql} = "SELECT order,line,item,release,dueToDockDate,dueToStockDate,userFieldAmount1 WHERE (releaseStatus &lt; '50' AND userFieldAmount1 = '$RELEASE' AND relatedQueryPurchaseOrder.orderStatus &lt; '40' AND remainingQuantityForReleaseStockingUm &gt; 0.000) ORDER BY order,line,release";

不起作用:

$XML-&gt;{'System-Link'}{Request}{QueryList}{Pql} = "SELECT order,line,item,release,dueToDockDate,dueToStockDate,userFieldAmount1 WHERE (releaseStatus &lt; '50' AND userFieldAmount1 = '$RELEASE' AND relatedQueryPurchaseOrder.orderStatus &lt; '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 &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 &gt; 0.000

那么为什么这会影响生成的 XML?

【问题讨论】:

  • 您忘记包含代码了。
  • 我提供的是问题代码sn-p,即有问题的确切代码。我还能提供什么帮助?我试图不使用大量代码来解决问题,保持简单。
  • 该代码只是一个更新数据结构的赋值。您没有描述如何将数据结构转换为 XML 文档。您甚至没有描述您正在使用的众多可用 XML 模块中的哪一个。
  • 完成。我不明白的是,为什么简单地将“AND remainingQuantityForReleaseStockingUm > 0.000”添加到作业中会修复生成的 XML。希望我提供了足够的信息。

标签: xml perl


【解决方案1】:

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 ...

【讨论】:

  • 另外,对于任何好奇的人,显然使用“1 > 0”也适用于我的情况。我在极少数情况下使用了它,我正在与之交谈的另一个系统使用了一些奇怪的 SQL 版本,它不会将“”视为不相等。不太可能,但比抱歉更安全,并且在我的情况下工作,产生“好”的 XML。但是暴民的想法确实很有效,所以我批准了他的解决方案。
猜你喜欢
  • 1970-01-01
  • 2020-12-29
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-21
  • 1970-01-01
  • 2014-08-10
相关资源
最近更新 更多