【问题标题】:Load XML file, replace all "X" with "Y" and carry on using file加载 XML 文件,将所有“X”替换为“Y”并继续使用文件
【发布时间】:2019-02-18 12:31:42
【问题描述】:

这是代码:

        $xml = simplexml_load_file($candidateFile);

        if (!$xml) {
            $this->addCritical("ERROR: " . basename($candidateFile));
            return;
        }

        $ModifiedXml = simplexml_load_string( str_replace( "\n</DESIGNATION_PLU>", '</DESIGNATION_PLU>', $xml ) );

最后一行不行,我需要的只是它会使用加载的 XML "$xml" 替换一些东西并使用修改后的 XML 继续工作。

如果我不清楚,或者您需要更多信息,请告诉我。

更大的代码部分:

$xml = simplexml_load_file($candidateFile);

if (!$xml) {
    $this->addCritical("ERROR: " . basename($candidateFile));
    return;
}

// Before it will write to the new files I need to fix original XML 

$candidateFilenameParts = explode('_', basename($candidateFile));
$candidateFileDatetime = str_replace('.xml', '', $candidateFilenameParts[3]);

$headerFilename = "header_$candidateFileDatetime.csv";
$productFilename = "product_$candidateFileDatetime.csv";
$paymentFilename = "payment_$candidateFileDatetime.csv";
$this->addInfo("");

XML:最初看起来,XML 中的值的结尾类似于“\n”

                <LIGNE>
                    <ID_TICKET>123</ID_TICKET>
                    <CODE_RAYON>123</CODE_RAYON>
                    <CODE_VENDEUR>123</CODE_VENDEUR>
                    <PLU>123</PLU>
                    <DESIGNATION_PLU>New 1234      
    ---> Next line  </DESIGNATION_PLU>
                    <CODE_EAN/>
                    <TYPE_ARTICLE>Pièce</TYPE_ARTICLE>
                    <QUANTITE_VENDUE>1</QUANTITE_VENDUE>
                    <UNITE_MESURE>123</UNITE_MESURE>
                    <PRIX_UNITAIRE_TTC>123</PRIX_UNITAIRE_TTC>
                    <MONTANT_VENTE_TTC>123</MONTANT_VENTE_TTC>
                    <SYMB_MONNAIE/>
                    <ANNULE>0</ANNULE>
                    <CODE_TVA>123</CODE_TVA>
                    <TVA_TAUX>123</TVA_TAUX>
                    <TYPE_TICKET>123</TYPE_TICKET>
                    <POURC_REMISE/>
                    <MONTANT_REMISE/>
                </LIGNE>

【问题讨论】:

  • simplexml_load_file 不返回字符串。你不能在上面使用str_replace。你可以先做一个str_replace,然后再将xml字符串加载到一个对象中。
  • 你不能 (AFAIK) str_replace() SimpleXMLElement ($xml)。您应该使用原始源字符串。虽然不确定替换的目的。
  • @NigelRen 我们接收 XML 并拆分为 Header、Payment 和 Product,但 XML 格式错误,导致其余代码崩溃。所以我需要的只是一段代码,它将加载 XML 修改它并继续使用修改后的 XML(不将其保存到新的)
  • 你能展示一下原始的 XML 是什么样的以及你需要如何拆分它吗?可能有一些方法可以维护正确的 XML 内容并且不需要任何其他处理。
  • @NigelRen 已添加 xml 示例(这只是示例)但通常 xml 已损坏,因为在新行上,不完全是在这里,它可能是其他地方......这就是为什么我想要一个检查器,所以它可以解决问题,如果会更多,我可以更新它并添加额外的修改

标签: php xml simplexml


【解决方案1】:

如果您有文件,例如...

<DOC>
    <LIGNE>
        <ID_TICKET>123</ID_TICKET>
        <CODE_RAYON>123</CODE_RAYON>
        <CODE_VENDEUR>123</CODE_VENDEUR>
        <PLU>123</PLU>
        <DESIGNATION_PLU>New 1234
        </DESIGNATION_PLU>
        <CODE_EAN />
        <TYPE_ARTICLE>Pièce</TYPE_ARTICLE>
        <QUANTITE_VENDUE>1</QUANTITE_VENDUE>
        <UNITE_MESURE>123</UNITE_MESURE>
        <PRIX_UNITAIRE_TTC>123</PRIX_UNITAIRE_TTC>
        <MONTANT_VENTE_TTC>123</MONTANT_VENTE_TTC>
        <SYMB_MONNAIE />
        <ANNULE>0</ANNULE>
        <CODE_TVA>123</CODE_TVA>
        <TVA_TAUX>123</TVA_TAUX>
        <TYPE_TICKET>123</TYPE_TICKET>
        <POURC_REMISE />
        <MONTANT_REMISE />
    </LIGNE>
</DOC>

使用trim() 更新元素以删除任何周围的空间会更容易,因为这将满足具有相同问题的任何其他内容...

$xml = simplexml_load_file($candidateFile);
function trimXML( SimpleXMLElement $element )  {
    foreach ( $element->children() as $node )    {
        if ( $node->count() > 0 )   {
            trimXML($node);
        }
        else    {
            $node[0] = trim((string)$node);
        }
    }
}
trimXML($xml);
echo $xml->LIGNE[0]->DESIGNATION_PLU.".".PHP_EOL;

给...

New 1234.

【讨论】:

  • 目前,此代码在我们的情况下不起作用,您认为是否可以为 load->Modify-> 编写额外的检查器继续使用?因为将来会更容易理解?
  • 不确定你的意思,一旦你运行了trimXML(),那么你可以根据需要处理$xml,最后echo...行只是一个使用测试数据的例子我'已经给出了答案,但是您需要将其用于所需的任何处理。
猜你喜欢
  • 1970-01-01
  • 2017-09-09
  • 1970-01-01
  • 2013-03-13
  • 2011-04-25
  • 2012-03-29
  • 1970-01-01
  • 1970-01-01
  • 2014-12-18
相关资源
最近更新 更多