【问题标题】:How can I extract value from an xml如何从 xml 中提取值
【发布时间】:2014-01-17 23:31:01
【问题描述】:

我是 PHP 新手。我正在尝试从以下 XML 中获取数据。现在,在我的代码$data->Address 中包含以下代码的值,即:

$data->Address = "<tolist></tolist>
        <cclist>
            <cc>
                <contactpersonname>niraj</contactpersonname>
                <name>niraj</name>
                <email>stgh@gmail.com</email>
                <number>+91.3212365212</number>
                <prefix>Ms.</prefix>
                <contactpersonprefix>Ms.</contactpersonprefix>
            </cc>
            <cc>
                <contactpersonname>fdg</contactpersonname>
                <name>admin</name>
                <email>admin12@gmail.com</email>
                <number>+91.4554343234</number>
                <prefix>Mr.</prefix>
                <contactpersonprefix>Mr.</contactpersonprefix>
            </cc>
        </cclist>";

现在我想提取&lt;contactpersonname&gt; 标签并打印出来。我该怎么做?

【问题讨论】:

  • 您想要所有联系人吗?

标签: php


【解决方案1】:

由于您的 XML 缺少包含所有其他标记的标记,因此您需要创建 on 以使解析器正常工作:

<?php
$buffer = "<tolist></tolist>
        <cclist>
            <cc>
                <contactpersonname>niraj</contactpersonname>
                <name>niraj</name>
                <email>stgh@gmail.com</email>
                <number>+91.3212365212</number>
                <prefix>Ms.</prefix>
                <contactpersonprefix>Ms.</contactpersonprefix>
            </cc>
            <cc>
                <contactpersonname>fdg</contactpersonname>
                <name>admin</name>
                <email>admin12@gmail.com</email>
                <number>+91.4554343234</number>
                <prefix>Mr.</prefix>
                <contactpersonprefix>Mr.</contactpersonprefix>
            </cc>
        </cclist>";

//   ***** wrap the whole thing in a <root> tag...
$xml   = simplexml_load_string("<root>".$buffer."</root>");
$array = json_decode(json_encode((array) $xml), 1);

echo "<pre>";
print_r($array);
echo "</pre>";
?>

结果:

Array
(
    [tolist] => Array
        (
        )

    [cclist] => Array
        (
            [cc] => Array
                (
                    [0] => Array
                        (
                            [contactpersonname] => niraj
                            [name] => niraj
                            [email] => stgh@gmail.com
                            [number] => +91.3212365212
                            [prefix] => Ms.
                            [contactpersonprefix] => Ms.
                        )

                    [1] => Array
                        (
                            [contactpersonname] => fdg
                            [name] => admin
                            [email] => admin12@gmail.com
                            [number] => +91.4554343234
                            [prefix] => Mr.
                            [contactpersonprefix] => Mr.
                        )

                )

        )

)

更新

现在您可以向下导航到您想去的地方

echo "<pre>";
$ccList = $array['cclist'];
$cc = $ccList['cc'];
$contacts = array();
foreach($cc as $i=>$val) {
  $contacts[$i]=$val['contactpersonname'];
}
echo "first contact: " . $contacts[0] . "<br>";
echo "second contact: " . $contacts[1] ."<br>";

结果:

first contact: niraj
second contact: fdg

【讨论】:

  • 您发布的内容在显示数组之前工作正常。当我尝试后面的部分来显示联系人姓名时。我收到此警告 - Illegal string offset 'contactpersonname'
  • 我更新了我的代码以显示如何访问数组元素,但我怀疑你已经弄清楚了,因为你刚刚接受了答案。
【解决方案2】:

您可以使用以下代码将 XML 转换为数组:

$xml   = simplexml_load_string($buffer);
$array = json_decode(json_encode((array) $xml), 1);

其中 $buffer 是 xml 字符串。

然后你可以得到人名如下:

$data->Address = $array['cclist']['cc']['contactpersonname'];

将 xml 转换为数组是一种快速而肮脏的方法,但它确实有效。

【讨论】:

  • 很快。它不脏。使用内置解析器是正确的方法。现在问题已被编辑,您可能希望扩展您的答案以包括如何处理一组值。
  • 它给了我一个空的 $array。 $array=Array ( [0] =&gt; )
  • 这是因为你有两个根节点,tolist 和 cclist。您能否将它们放入元数据节点中,例如 {...}。那么 simplexml_load_string 就不会报错了。
  • 我可以在第一行和最后一行连接并添加它。请指导我
  • 我不知道您是否可以更改 XML 数据,如果可以,您可以添加一个占位符元数据(因为我认为这都是关于电子邮件的元数据?),这意味着您的 XML 数据看起来像{...}
【解决方案3】:

试试这个..

$xml = new SimpleXMLElement($string);
$results = $xml->xpath('cclist/cc/contactpersonname');

http://php.net/manual/en/simplexmlelement.xpath.php

【讨论】:

【解决方案4】:
$xml = simplexml_load_file("note.xml");
echo $xml->contactpersonname;

这需要您从 xml 文件中加载它。如果您在代码中已经有了字符串,我建议您使用正则表达式。 如果您知道数据永远不会写错!

$pattern = '#<contactpersonname>(.*?)</contactpersonname>#';
echo preg_match ($pattern, $data->Address);

【讨论】:

    猜你喜欢
    • 2019-11-22
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 2018-07-25
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多