gpt4 book ai didi

php - 在 PHP 中使用命名空间循环 xml

转载 作者:行者123 更新时间:2023-12-04 17:06:20 35 4
gpt4 key购买 nike

我正在尝试在 PHP 中读取带有命名空间的 xml 的元素,但是我遇到了一些问题,可能是因为存在多个子节点和存在命名空间。事实上,我对没有命名空间的 xml 文件没有任何问题。

我想找到一种优雅的方式来循环节点内的信息,例如我想读取元素“费用”内的所有数据(日期、商店、iditem、价格......),并可能将它们插入到数组中.
这是xml:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<Response xmlns="http://www.w3.org/2001/XMLSchema-instance">
<Result xmlns:a="http://www.w3.org/2001/XMLSchema-instance" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Success xmlns="http://www.w3.org/2001/XMLSchema-instance">OK</Success>
<a:Name>John</a:Name>
<a:Surname>Doe</a:Surname>

<a:Expenses>

<a:Expense>
<a:Date>2019-01-01</a:Date>
<a:Store>MALL1</a:Store>
<a:Items>
<a:Item>
<a:IdItem>A1</a:IdItem>
<a:Price>5</a:Price>
</a:Item>
</a:Items>
</a:Expense>

<a:Expense>
<a:Date>2019-01-02</a:Date>
<a:Store>MALL2</a:Store>
<a:Items>
<a:Item>
<a:IdItem>A2</a:IdItem>
<a:Price>1</a:Price>
</a:Item>
<a:Item>
<a:IdItem>A3</a:IdItem>
<a:Price>3</a:Price>
</a:Item>
</a:Items>
</a:Expense>

</a:Expenses>
</Result>
</Response>


我试过这样的事情:
$info= new SimpleXMLElement($xml);
$info->registerXPathNamespace('s', 'http://example.com');
$info->registerXPathNamespace('a', 'http://www.w3.org/2001/XMLSchema-instance');

//Example 1:
foreach($info->xpath('//a:Name') as $header)
{
echo (string) $header;
}
//Result is: John

//Example 2:
foreach($info->xpath('//a:Expenses') as $header)
{
$array = $header->xpath('//a:Expense/a:Store');
print_r($array);
}

//Result is:
/*Array
(
[0] => SimpleXMLElement Object
(
[0] => MALL1
)

[1] => SimpleXMLElement Object
(
[0] => MALL2
)

[2] => SimpleXMLElement Object
(
[0] => MALL2
)

)*/

//Example 3:
$array=$info ->xpath('/*/s:Body');
echo (string) $array[0]->Response->Result->Success;
//Result is: OK

但是,当然,这不是最好的方法,因为我一次只能得到一个元素并且无法进行适当的循环。
您将如何以更优雅和正确的方式阅读此 xml 的各种元素?
谢谢你。

最佳答案

这是 SOAP,而不仅仅是 XML。最好的选择是使用 SOAP 库。

但是,您面临的问题是该行 foreach($info->xpath('//a:Expenses') as $header)分配不同的 SimpleXMLElement实例到 $header对您在 $info 上所做的注册一无所知的变量多变的。您需要在每个 SimpleXMLElement 上重复注册。 .

$info= new SimpleXMLElement($xml);
$info->registerXPathNamespace('s', 'http://example.com');
$info->registerXPathNamespace('a', 'http://www.w3.org/2001/XMLSchema-instance');

foreach($info->xpath('//a:Expenses') as $header)
{
$header->registerXPathNamespace('a', 'http://www.w3.org/2001/XMLSchema-instance');
$array = $header->xpath('//a:Expense/a:Store');
print_r($array);
}

或者你开始使用 DOM。在 DOM 中,您可以创建一个单独的对象来计算 Xpath 表达式。因此,您只需注册一次。此外,您可以使用返回标量值的 Xpath 表达式。
$document = new DOMDocument();
$document->loadXML($xml);
$xpath = new DOMXpath($document);
$xpath->registerXPathNamespace('s', 'http://example.com');
$xpath->registerXPathNamespace('a', 'http://www.w3.org/2001/XMLSchema-instance');

foreach($xpath->evaluate('//a:Expenses/a:Expense') as $expense)
{
print_r($xpath->evaluate('string(a:Store)', $expense));
}

关于php - 在 PHP 中使用命名空间循环 xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55608208/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com