使用XPath和PHP进行XML解析处理空值

时间:2014-02-18 12:13:08

标签: php xml parsing csv xpath

在解析这样的XML树时:

<vco:ItemDetail>
    <cac:Item>
        <cbc:Description>ROLLENKERNSATZ 20X12 MM 10,5 GR.</cbc:Description>
        <cac:SellersItemIdentification>
            <cac:ID>78392636</cac:ID>
        </cac:SellersItemIdentification>
        <cac:ManufacturersItemIdentification>
            <cac:ID>RMS100400370</cac:ID>
            <cac:IssuerParty>
               <cac:PartyName>
                   <cbc:Name></cbc:Name>
               </cac:PartyName>
            </cac:IssuerParty>
        </cac:ManufacturersItemIdentification>
    </cac:Item>
    <vco:Availability>
       <vco:Code>available</vco:Code>
    </vco:Availability>
</vco:ItemDetail>

如果cbc:Name为空,我总是会得到一个空格,这会破坏我的CSV结构,如下所示:

"ROLLENKERNSATZ 20X12 MM 10,5 GR.";78392636;;RMS100400370;"";available

“可用”字符串在一个新行中,因此我的CSV不再被编码。

我的XPath数组如下所示:

$columns = array('Description' => 'string(cac:Item/cbc:Description)',
          'SellersItemIdentification' => 'string(cac:Item/cac:SellersItemIdentification/cac:ID)',
          'StandardItemIdentification' => 'string(cac:Item/cac:StandardItemIdentification/cac:ID)',
          'Availability' => 'string(vco:Availability/vco:Code)',
          'Producer' => 'string(cac:Item/cac:ManufacturersItemIdentification/cac:IssuerParty/cac:PartyName/cbc:Name');

我可以处理任何表示或替换,例如用“no producer”或类似的东西替换空节点值吗?

谢谢

1 个答案:

答案 0 :(得分:1)

如果用作“默认”的值可以以某种方式存在于输入文档的某个位置,那么可以通过这样的准合并来解决问题:

e.g。

<vco:ItemDetail xmlns:vco="x1" xmlns:cac="x2" xmlns:cbc="x3">
   <ValueIfNoProducer>No Producer</ValueIfNoProducer>
   <cac:Item>
      ...

如果Name元素为空或空格,则此Xpath 1.0将应用默认值:

(cac:Item/cac:ManufacturersItemIdentification/cac:IssuerParty
     /cac:PartyName/cbc:Name[normalize-space(.)] | ValueIfNoProducer)[1]

认为可以直接在XPath 2.0中使用以下内容,但我有待纠正:

(cac:Item/cac:ManufacturersItemIdentification/cac:IssuerParty
     /cac:PartyName/cbc:Name[normalize-space(.)] | 'No Producer')[1]