使用简单的 XML (php 改变一个属性)

using simple XML (php to change one attribute)

我有一个 xml 字符串形式的输入,我想查看它并找到一个特定的元素并对其进行修改。

我感兴趣的 xml 输入部分看起来像这样,并且是字符串中层次结构的一部分

<com:GTe Type="GTe" xmlns:com="http://xyx.com/Gte">
    <com:Cd ED="2021-07" Number="0123456789"/>
</com:GTe>

ED 元素各不相同,因此我只对识别具有数字属性的所有 com:Cd 子元素感兴趣,然后将数字属性的最后三位数字以外的所有数字更改为另一个字符串。

该项目使用 Symfony 和简单的 XML php,但我不确定如何执行此操作,因为 xml 的其他部分使用数字键获取其他数据。

尝试了以下

 $message = 
'<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <uv:HCRReq
         <com:GTe Type="GTe" xmlns:com="http://xyx.com/Gte">
             <com:Cd ED="2021-07" Number="0123456789"/>
         </com:GTe>
      </uv:HCRReq>
   </soapenv:Body>
</soapenv:Envelope>';

    $xmlstring = simplexml_load_string($message);

    //currently not working
    $number = $xmlstring->soapenv:Envelope->soapenv:Body->uv:HCRReq->com:GTe->com:CD->number;

    $length = strlen($number);
    //need to check length is 11 or 12 long

    $alteredNum = '1234567'.substr($number,length-3,3);

// Not sure how to set the string

你能试试这个吗:

$message =
    '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <uv:HCRReq>
         <com:GTe Type="GTe" xmlns:com="http://xyx.com/a">
             <com:Cd ED="2021-07" Number="012345678999"/>
         </com:GTe>
      </uv:HCRReq>
   </soapenv:Body>
</soapenv:Envelope>';

$xml = simplexml_load_string($message);

$nodes = $xml->xpath('//*[name()="com:Cd" and @Number]');
if ($nodes) {
    $number = (string)$nodes[0]->attributes()['Number'];
    if (12 === strlen($number) || 11 === strlen($number)) {
        unset($nodes[0]->attributes()['Number']);
        $nodes[0]->addAttribute('Number', '111' . substr($number, -3, 3));
    }
}

print_r($xml->asXML());

结果:

<?xml version="1.0"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <uv:HCRReq>
         <com:GTe xmlns:com="http://xyx.com/a" Type="GTe">
             <com:Cd ED="2021-07" Number="111999"/>
         </com:GTe>
      </uv:HCRReq>
   </soapenv:Body>
</soapenv:Envelope>

虽然 <uv:HCRReq xml 开始标记似乎丢失了 > 但这可能是复制粘贴问题。