【问题标题】:PHP parsing xml xpathPHP解析xml xpath
【发布时间】:2011-08-03 20:14:47
【问题描述】:

XML

<person>
    <description>
        <p>blah blah blah</p>
        <p>kjdsfksdjf</p>
    </description>
</person>
<person>
    <description>
        k kjsdf kk sak kfsdjk sadk
    </description>
</person>

我想解析描述,以便它返回里面的 html 标签。

这两个我都试过了,都没有成功

$description = ereg_replace('<description>|</description>','',$person->description->asXML());

$description = $person->description;

有什么建议吗?

编辑

我想要完成的是将 xml 文件导入 mysql 数据库。一切正常,接受上面提到的内容......描述中的段落标签没有显示......他们需要在那里。 mysql 字段“description”设置为文本字段。如果我要解析 xml 以在浏览器中输出,那么 $description = ereg_replace('&lt;description&gt;|&lt;/description&gt;','',$person-&gt;description-&gt;asXML()); 可以正常工作......虽然当我尝试导入 mysql 时这不是真的。我需要在 mysql INSERT 中添加一些东西吗? mysql_query("UPDATE table SET description = '$value' WHERE id = '$id'");

【问题讨论】:

  • 您打算如何将 XML 引入您的 PHP 脚本?
  • 您的 XML 无效,因为它缺少根元素。另请注意,HTML 不能用 XML 表示,因为它基于 SGML,而不是 XML(不同的规则)。您正在寻找 XHTML,但 description 元素内的 p 元素不是 XHTML,如果您不为它们分配 XHTML 名称空间。它们只是无效 XML 的任何 XML 应用程序的元素。
  • @Gordon - xml 不是无效的......这是概述特定问题的简短示例。
  • @Jeffrey 那么这是一个无效的简短示例,概述了具体问题。

标签: php mysql xml parsing xpath


【解决方案1】:

请熟悉SimpleXml API:

$xml = <<< XML
<person>
    <description>
        <p>blah blah blah</p>
        <p>kjdsfksdjf</p>
    </description>
</person>
XML;

$person = simplexml_load_string($xml);
foreach ($person->description->children() as $child) {
    echo $child->asXml();
}

给予

<p>blah blah blah</p><p>kjdsfksdjf</p>

请注意,SimpleXml 不能对您显示的第二个描述元素执行相同操作,因为它没有文本节点的概念,例如

$xml = <<< XML
<person>
    <description>
        k kjsdf kk sak kfsdjk sadk
    </description>
</person>
XML;
$person = simplexml_load_string($xml);
foreach ($person->description->children() as $child) {
    echo $child->asXml();
}

将返回一个空字符串。如果您想要统一的 API,请使用 DOM:

$xml = <<< XML
<people>
    <person>
        <description>
            <p>blah blah blah</p>
            <p>kjdsfksdjf</p>
        </description>
    </person>
    <person>
        <description>
            k kjsdf kk sak kfsdjk sadk
        </description>
    </person>
</people>
XML;

$dom = new DOMDocument;
$dom->loadXml($xml);
$xp = new DOMXPath($dom);
foreach ($xp->query('/people/person/description/node()') as $child) {
    echo $dom->saveXml($child);
}

会给

        <p>blah blah blah</p>
        <p>kjdsfksdjf</p>

        k kjsdf kk sak kfsdjk sadk

将XML导入MySql,也可以使用http://dev.mysql.com/doc/refman/5.5/en/load-xml.html

【讨论】:

    【解决方案2】:

    我想解析描述,让它返回里面的 html 标签。

    在 XPath 中,您可以选择 description 元素的子节点。

    用途:

     "//person/description/*"
    

    获取所有子节点(仅限html标签)或

     "//person/description/node()"
    

    获取所有子节点(html标签和文本节点)。

    例如,这个 php 代码:

    <?php
    $xml = simplexml_load_file("test.xml");
    
    $result = $xml->xpath("//person/description/*");
    
    print_r($result);
    ?>
    

    返回一个 SimpleXMLElements 数组,它们是description 的子元素。检索每个项目及其所有后代节点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-10
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 2018-10-18
      相关资源
      最近更新 更多