【问题标题】:php simplexml_load_string ignores elementsphp simplexml_load_string 忽略元素
【发布时间】:2017-06-11 12:24:40
【问题描述】:

也许你可以帮助我:我尝试解析这个 xml 文件

<norm>

    <metadaten>
        <jurabk>GWB</jurabk>
        <enbez>§ 99</enbez>
        <titel format="XML">Öffentliche Auftraggeber</titel>
    </metadaten>

    <textdaten>

        <text format="XML">
            <Content>
                <P>Öffentliche Auftraggeber sind 
                    <DL Type="arabic">
                        <DT>1.</DT>
                        <DD Font="normal">
                            <LA>Gebietskörperschaften sowie deren Sondervermögen,</LA>
                        </DD>
                    </DL>
                </P>
            </Content>
        </text>

        <fussnoten>
            <Content>
                <P>(+++ § 99: Zur Anwendung vgl. § 41 Abs. 2 MessbG +++)</P>
            </Content>
        </fussnoten>

    </textdaten>

</norm>

使用解析时:

$xml=simplexml_load_string($xmlStr) or die("Error: Cannot create object");

echo "<pre>";
print_r($xml);
echo "</pre>";

它忽略了“DL”中的部分。路径 norm->textdaten->text->Content->P 不完整。

结果是:

SimpleXMLElement Object
(
   [metadaten] => SimpleXMLElement Object
    (
      [jurabk] => GWB
      [enbez] => § 99
      [titel] => Öffentliche Auftraggeber
    )

    [textdaten] => SimpleXMLElement Object
    (
        [text] => SimpleXMLElement Object
         (
          [@attributes] => Array
            (
              [format] => XML
            )
          [Content] => SimpleXMLElement Object
           (
             [P] => Öffentliche Auftraggeber sind
           )
         )

        [fussnoten] => SimpleXMLElement Object
         (
          [Content] => SimpleXMLElement Object
            (
               [P] => (+++ § 99: Zur Anwendung vgl. § 41 Abs. 2 MessbG +++)
            )
        )
    )
)

你知道如何正确解析它吗?

也许 simplexml_load_string 函数无法在

之间检索文本

和 DL??

谢谢!

【问题讨论】:

    标签: php xml parsing xml-parsing


    【解决方案1】:

    它不会忽略它们。调试输出不会显示所有可访问的数据,因为它取决于您访问它的方式。例如,如果您将属性用作列表 (foreach) 或字符串,则存在差异。

    在您的情况下,问题在于 SimpleXML 如何处理节点的文本内容。它只返回第一个文本子节点的内容。在 DOM 中,这里有一个属性 $textContent,它包含所有后代节点的文本内容。因此,获取文本最简单的方法是将 SimpleXMLElement 转换为 DOMElement 实例。

    $xml = <<<'XML'
    <div>
      <p>
        Some Text
        <dl>
          <dd>in descendant nodes</dd>
        </dl>
      </p>
    </div>
    XML;
    
    $div = new SimpleXMLElement($xml);
    // only the first text child
    var_dump((string)$div->p);  
    // all text content
    var_dump(dom_import_simplexml($div->p)->textContent);
    

    输出:

    string(22) "
        Some Text
    
      "
    string(53) "
        Some Text
    
          in descendant nodes
    
      "
    

    这包括空白节点(仅包含换行符、空格等的节点)。因此,根据您之后如何使用文本内容,您可能需要使用字符串函数对其进行清理。

    XML 片段

    如果您想要的不仅仅是 XML,而是整个节点作为 XML 字符串,您可以使用 SimpleXMLElement::asXml()DOMDocument::saveXml()

    $div = new SimpleXMLElement($xml);
    var_dump($div->p->asXml());  
    
    $node = dom_import_simplexml($div->p);
    var_dump($node->ownerDocument->saveXml($node));
    

    DOM 允许一些选项和保存 HTML。

    要将所有子节点保存在 p 中,请迭代 DOMNode::$childNodes。请注意,这不仅包括元素,也不包括文本节点、cmets,...

    $node = dom_import_simplexml($div->p);
    $result = '';
    foreach ($node->childNodes as $child) {
      $result .= $node->ownerDocument->saveXml($child);
    }
    var_dump($result);
    

    使用 Xpath 可以轻松迭代特定节点。寻找SimpleXMLElement::xpath()DOMXpath::evaluate()

    【讨论】:

    • 谢谢!有没有办法获得 1)&lt;p&gt;&lt;/p&gt; 之间的整个输出(包括
      -tags 或 2)某种允许我处理不同内容的数组?
    • 我在答案中添加了一些信息。请注意,SimpleXML 是有限的——它是 DOM 之上的抽象,以允许 PHP 语法糖。但正因为如此,它对你隐藏了一些东西。
    【解决方案2】:

    这是因为 xml 中混合了文本和标签。您必须将 xml 修改为用标签分隔。我在这里添加了TEST 标签。你可以随心所欲地改变它

    <?php
    $xmlStr = '<norm>
       <metadaten>
          <jurabk>GWB</jurabk>
          <enbez>§ 99</enbez>
          <titel format="XML">Öffentliche Auftraggeber</titel>
       </metadaten>
       <textdaten>
          <text format="XML">
             <Content>
                <P>
                   <TEST>Öffentliche Auftraggeber sind</TEST>
                   <DL Type="arabic">
                      <DT>1.</DT>
                      <DD Font="normal">
                         <LA>Gebietskörperschaften sowie deren Sondervermögen,</LA>
                      </DD>
                   </DL>
                </P>
             </Content>
          </text>
          <fussnoten>
             <Content>
                <P>(+++ § 99: Zur Anwendung vgl. § 41 Abs. 2 MessbG +++)</P>
             </Content>
          </fussnoten>
       </textdaten>
    </norm>';
    
    $xml=simplexml_load_string($xmlStr) or die("Error: Cannot create object");
    
    echo "<pre>";
    print_r($xml);
    echo "</pre>";
    

    在此处检查 o/p:https://eval.in/815329

    【讨论】:

    • 谢谢!不幸的是,我无法修改 XML。你知道有什么方法可以将“norm->textdaten->text->Content->P”的内容作为纯文本获取吗?
    猜你喜欢
    • 2015-04-01
    • 2011-06-29
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 2013-09-24
    • 2021-11-20
    相关资源
    最近更新 更多