gpt4 book ai didi

php - 当其中已经有内容时,如何获取 xml 标签的内部文本?

转载 作者:数据小太阳 更新时间:2023-10-29 02:45:49 27 4
gpt4 key购买 nike

这是我正在使用的示例 xml:

<contact id="43956">
<personal>
<name>
<first>J</first>
<middle>J</middle>
<last>J</last>
Some text...
</name>
<title>Manager</title>
<employer>National</employer>
<dob>1971-12-22</dob>
</personal>
</contact>

我得到了 Some text... 但现在我需要我的代码来读取整个 xml 文档。它也没有读取 xml 中的值...如您所知,我以前从未使用过 XMLReader

这是我得到的:

Array ( [contact] => Array ( [id] => 43956 [value] => some sample value ) [first] => [middle] => [last] => [#text] = > 一些文本... [姓名] => [职位] => [雇主] => [dob] => [个人] => )

这是我现在的代码:

function xml2array($file, array $result = array()) {
$lastElementNodeType = '';
$xml = new XMLReader();
if(!$xml->open($file)) {
die("Failed to open input file");
}
while($xml->read()) {
switch ($xml->nodeType) {
case $xml::END_ELEMENT:
$lastElementNodeType = $xml->nodeType;
case $xml::TEXT:
$tag = $xml->name;
if($lastElementNodeType == 15) {
$result[$tag] = $xml->readString();
}
case $xml::ELEMENT:
$lastElementNodeType = $xml->nodeType;
$tag = $xml->name;
if($xml->hasAttributes) {
while($xml->moveToNextAttribute()) {
$result[$tag][$xml->name] = $xml->value;
}
}
}
}
print_r($result);
}

我考虑过让这个函数递归,但当我尝试这样做时,它让数组变得非常困惑。

我有一个这样的版本,但它仍然没有在 first 等中输出 J :

function xml2assoc($xml) { 
$tree = null;
while($xml->read())
switch ($xml->nodeType) {
case XMLReader::END_ELEMENT: return $tree;
case XMLReader::ELEMENT:
$node = array('tag' => $xml->name, 'value' => $xml->isEmptyElement ? '' : xml2assoc($xml));
if($xml->hasAttributes)
while($xml->moveToNextAttribute())
$node['attributes'][$xml->name] = $xml->value;
$tree[] = $node;
break;
case XMLReader::TEXT:
case XMLReader::CDATA:
$tree .= $xml->value;
}
return $tree;
}

最佳答案

拿1

我认为您需要做的是保存最近节点的类型或至少是最后一个节点的类型,以便可以对其进行测试。简而言之,至少当您在示例 XML 中呈现它时,您将遇到一个 ELEMENT_END 节点类型,一个包含您正在查找的文本的 TEXT 节点类型for,然后是另一个 ELEMENT_END 节点类型。

因此您将需要一个case $xml::TEXT,并且您还需要保存先前的节点类型以便您的解析器知道,在正常情况下它应该期待一个新的 ELEMENT 事件,或者一个 END_ELEMENT 事件,但却收到了 TEXT。这将是您需要使用 readString() 将文本捕获到临时变量的信号,然后将其保存以供您使用,或者等待查看下一个节点是否也是 ELEMENT_END 此时您可以保存它并清除临时变量。

拍摄2

现在我们对您希望得到的结果有了更多的了解(即,由于您希望捕获整棵树,而不仅仅是其中的特定信息),我建议您坚持使用递归版本的功能。我稍微修改了你的那个(主要的实质性变化见 TEXT 和 CDATA 案例)。

function xml2assoc($xml)
{
$tree = null;
while($xml->read())
{
switch ($xml->nodeType)
{
case XMLReader::END_ELEMENT:
return $tree;
case XMLReader::ELEMENT:
$node = array('tag' => $xml->name, 'value' => $xml->isEmptyElement ? '' : xml2assoc($xml));
if($xml->hasAttributes)
while($xml->moveToNextAttribute())
$node['attributes'][$xml->name] = $xml->value;
$tree[] = $node;
break;
case XMLReader::TEXT:
$tree["text"] = $xml->value;
break;
case XMLReader::CDATA:
$tree["cdata"] = $xml->value;
break;
}
}
return $tree;
}

这种情况下的输出如下:

Array
(
[0] => Array
(
[tag] => contact
[value] => Array
(
[0] => Array
(
[tag] => personal
[value] => Array
(
[0] => Array
(
[tag] => name
[value] => Array
(
[0] => Array
(
[tag] => first
[value] => Array
(
[text] => J
)
)
[1] => Array
(
[tag] => middle
[value] => Array
(
[text] => J
)
)
[2] => Array
(
[tag] => last
[value] => Array
(
[text] => J
)
)
[text] => Some text...
)
)
[1] => Array
(
[tag] => title
[value] => Array
(
[text] => Manager
)
)
[2] => Array
(
[tag] => employer
[value] => Array
(
[text] => National
)
)
[3] => Array
(
[tag] => dob
[value] => Array
(
[text] => 1971-12-22
)
)
)
)
)
[attributes] => Array
(
[id] => 43956
)
)
)

我假设这就是您要进行的小修改,尽管我们实际上只是在这里重新发明轮子。我希望您需要解析的 XML 不是特别大。

关于php - 当其中已经有内容时,如何获取 xml 标签的内部文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13898399/

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