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>";
}
我在使用 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>";
}