【问题标题】:Replace Reference Object Value in PHP SimpleXML替换 PHP SimpleXML 中的引用对象值
【发布时间】:2017-10-02 07:18:48
【问题描述】:

我正在尝试回显图像 URL 来代替 referencedObject。我在正确的位置获取引用的对象,但是当我尝试用与引用的对象对应的图像 URL 替换它时,代码没有在正确的位置被替换,它显示在文本上方大约 2 行。

在 PHP 中使用 SimpleXML。

<component>
 <section ID="Ld8e0a7b8-429c-4a7d-84ff-8b4698b7adc7">
 <title>DESCRIPTION </title>
 <text>
    <paragraph>Lorem ipsum dolor sit amet, consectetur adipiscing elit...</paragraph>

   <paragraph>Here is the image 1 </paragraph>
   <paragraph>
       <renderMultiMedia referencedObject="Lc0d31387-d262-4702-8053-0207e1a3fc91"/>
    </paragraph>
   <paragraph>Here is Image 2 , tempor incidid labore et dolore magna aliqua. Ut enim ad minim </paragraph>
    <paragraph>
      <renderMultiMedia referencedObject="L3dcd8ff8-678a-4e9f-8bb2-d6f3c35d1c10"/>
    </paragraph>
   <paragraph>tempor incidid labore et dolore magna aliqua. Ut enim ad minim </paragraph>
    <paragraph>tempor incidid labore et dolore magna aliqua. Ut enim ad minim </paragraph>
    <paragraph/>
</text>
<component>
    <observationMedia ID="Lc0d31387-d262-4702-8053-0207e1a3fc91">
       <text>image description</text>
       <value mediaType="image/jpeg" xsi:type="ED">
          <reference value="Image1.jpg"/>
       </value>
    </observationMedia>
 </component>
 <component>
  <observationMedia ID="L3dcd8ff8-678a-4e9f-8bb2-d6f3c35d1c10">
       <text>image description</text>
       <value mediaType="image/jpeg" xsi:type="ED">
          <reference value="Molecule2.jpg"/>
       </value>
    </observationMedia>
 </component>
</section>

这是我获取每个 id 值的方法:

for($i=0; $i < $pcount; $i++) //$pcount = no. of paragraphs in the xml 
{ 
    $reference_value =  (string) $component->section->component[$i]->observationMedia->value->reference['value'];
    $referencedObject = (string) $component->section->text->paragraph[$i]->renderMultiMedia['referencedObject'];
    $observationMedia_ID = (string) $component->section->component[$i]->observationMedia['ID'];
}

这是原始 xml 响应:pastebin.com/raw/fnWbifx0

【问题讨论】:

标签: php xml simplexml


【解决方案1】:

我使用 XPath 来帮助查找相关数据。

我希望我已经正确理解了这个问题,每个renderMultiMedia 指的是一个observationMedia 对象。这是我使用 XPath 来确保找到相应数据的地方。您假设段落编号与媒体信息的顺序相匹配,这并不总是正确的。

<?php
error_reporting ( E_ALL );
ini_set ( 'display_errors', 1 );

$xml = simplexml_load_file("so.xml");
$xml->registerXPathNamespace("d", "urn:hl7-org:v3");
$rmElements = $xml->xpath("//d:renderMultiMedia");
$mediaData = [];
foreach ( $rmElements as $media)
{
    $referencedObject = (string)$media['referencedObject'];
    $mediaElement = $xml->xpath("//d:observationMedia[@ID='$referencedObject']")[0];
    $reference_value =  (string) $mediaElement->value->reference['value'];
    $observationMedia_ID = (string) $mediaElement['ID'];
    $mediaData[] = [ 'referencedObject' => $referencedObject,
            'reference_value' => $reference_value,
            'observationMedia_ID' => $observationMedia_ID
    ];

}
print_r($mediaData);

正如您从代码中看到的那样,我还将其更改为首先查找任何 renderMultiMedia 元素(d: 存在,因为这考虑了使用 registerXPathNamespace 方法设置的默认命名空间)然后对于每一个,它交叉引用 referencedObject 属性和 observationMedia 元素。

它构建了一个数组 - 但我希望您可以将其更改为您需要使用数据的方式。

【讨论】:

    猜你喜欢
    • 2016-06-12
    • 2013-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    相关资源
    最近更新 更多