XML - 使用 SimpleXML 从命名空间获取值

XML - getting value from namespace using SimpleXML

我在使用 Simple XML 获取特定命名空间值时遇到问题。

这是 XML 文件中的一个片段:

<message xmlns:blend="http://www.blendlabs.com"
 xmlns:ulad="http://www.datamodelextension.org/Schema/ULAD"
 xmlns="http://www.mismo.org/residential/2009/schemas"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:xlink="http://www.w3.org/1999/xlink"
 targetnamespace="http://www.mismo.org/residential/2009/schemas">
  <deal_sets>
    <deal_set>
      <deals>
        <deal>
          <loans>
            <loan loanroletype="SubjectLoan" sequencenumber="1" xlink:label="LOAN_1">
              <extension>
                <other>
                  <blend:loan xlink:label="LOAN_1_BLEND_EXTENSION">
                    <blend:marketing_items>
                      <blend:marketing_item>
                        <blend:marketingtypevalue>DirectMarketingCode</blend:marketingtypevalue>
                        <blend:marketingvalue>google.com</blend:marketingvalue>
                      </blend:marketing_item>
                    </blend:marketing_items>
                  </blend:loan>
                </other>
              </extension>
            </loan>
          </loans>
        </deal>
      </deals>
    </deal_set>
  </deal_sets>
</message>

我要获取的值是来自代码段末尾 blend:marketingvalue 字段的 google.com

我可以很好地访问非命名空间值,但我不知道如何访问 blend 字段的嵌套命名空间值。

这是我尝试使用的代码:

$xml  = simplexml_load_string($body);
        
$blend = $xml->children('http://www.blendlabs.com');
        
$marketing_value = $xml->DEAL_SETS->DEAL_SET->DEALS->DEAL->LOANS->LOAN->EXTENSION->OTHER->$blend->LOAN->MARKETING_ITEMS->MARKETING_ITEM->MARKETINGVALUE;

echo $marketing_value; // just echo's nothing currently.

所以我想我的问题是,如何格式化它以访问嵌套对象?

是否需要将 $blend 变量放在每个对象项的前面?

你应该如何使用 children 函数?

如有任何帮助,我们将不胜感激。

children() 方法不 return 命名空间的某种标记,它 return 是一个元素列表 - children 在给定的命名空间中。

$xml 变量表示顶级 message 元素,它在 http://www.blendlabs.com 命名空间中没有任何子元素,因此 $xml->children('http://www.blendlabs.com') 只会 return 一个空列表。您需要先导航到 other 元素,然后在 http://www.blendlabs.com 命名空间中获取 its 个子元素,其中将包含 loan 元素。

由于顶级元素位于 http://www.mismo.org/residential/2009/schemas 命名空间中,您可能需要额外调用 children() 以确保您首先 select。

您没有提供完整的 XML,所以我无法测试代码(我不喜欢手动编写所有那些关闭标签),但它看起来像这样:

$marketing_value = (string)
   $xml
   ->children('http://www.mismo.org/residential/2009/schemas')
   ->deal_sets->deal_set->deals->deal->loans->loan->extension->other
   ->children('http://www.blendlabs.com')
   ->loan->marketing_items->marketing_item->marketingvalue;

由于您要获取特定命名空间值 blend:marketingvalue。在那种情况下,您可以直接通过 XPath.

获取它
echo $xml->xpath('//blend:marketingvalue')[0]; //google.com

注意: xpath returns 一个对象数组,所以既然你有一个值,请从第一个位置 [0] 访问它。但是,如果还有其他人,您可以使用 foreach.

foreach ($xml->xpath('//blend:marketingvalue') as $value) {
    echo "marketing value: ". $value ."<BR>";
}