使用php从字符串中检索html和XML


retrieve html and XML from a string with php

我的项目是使用CKEditor并创建一个插件在页面内创建图表,以显示结果(在CKEditor中,当您使用插件时,只会出现一个img)。

插件已经创建,当您使用它时,将在CKEditor中创建具有所需值和属性的XML。因此,图表的XML与书写文本一起存在(CKEditor的格式为<p>)。

当您在CKEditor中保存时,XML和HTML形式的文本将在字符串中发送到数据库(当我从CKEditor检索数据时,它会发送一个字符串)。

在数据库中,它是这样存储的:

<?xml version="1.0"?>
<configuration>
    <onglet pos="1" name="test">
        <wysiwyg>
            <code>
                &lt;p&gt;test&lt;/p&gt;&#xD;
                &#xD;
                &lt;p&gt;&lt;graphique drawer="Line" interval="2" periode="semaine" titre="test" type="Relative"&gt;
                    &lt;serie marqueur="Normal"&gt;
                        &lt;index serial="---" type="di"&gt;3&lt;/index&gt;
                        &lt;typegroupe&gt;&lt;/typegroupe&gt;
                        &lt;intervalgroup&gt;&lt;/intervalgroup&gt;
                        &lt;periodgroup&gt;&lt;/periodgroup&gt;
                        &lt;groupverif&gt;non&lt;/groupverif&gt;
                        &lt;unite&gt;Kwh&lt;/unite&gt;
                        &lt;legend&gt;test2&lt;/legend&gt;
                        &lt;color&gt;#000000&lt;/color&gt;
                    &lt;/serie&gt;
                 &lt;/graphique&gt;&lt;/p&gt;&#xD;
            </code>
        </wysiwyg>
    </onglet>
</configuration>

我把它放在一个php页面中,显示我的文本和来自CKEditor 的图表

像这样:

$test=200;  //ID
$testxml=loadxml($test);
$testonglet=$testxml->onglet;
$testwysiwyg=$testonglet->wysiwyg;
$testcode=$testwysiwyg->code;

loadxml是另一个文件中的php函数:

$loadXml = THE QUERY TO RETRIEVE THE XML FROM THE DB
$reqload = mysql_fetch_array(mysql_query($loadXml));
$decode = html_entity_decode($reqload[0]);
$xml = simplexml_load_string($decode);
       return $xml;

现在,如果我做var_dump($testcode);

我得到了:

object(SimpleXMLElement)#6 (1) { [0]=> string(403) "
test
4nonKwhtest2#000000
test après graph
" }

test和test après图只是文本,但4nonKwhtest2#000000是插件图表中的XML值。

我想解析字符串以检索文本和XML(使用他的结构,因为我需要它来用php创建图表)

我已经测试过:

$testXML = Simplexml_load_string($testcode);
var_dump($testXML);

它给了我:

bool(false)

我有来自XMLReader的相同内容。

我还测试了:

$dom = new DOMDocument();
$dom->loadHTML($testcode);

它提供了一些文本,但我无法从中检索到我的XML

我不知道该怎么处理了,这是我第一次使用PHP

我希望这样更清楚(对不起我的英语)。

基本上,您有一个XML文档,其中包含另一个XML片段作为文本节点。

这意味着您需要首先加载外部XML文档,读取文本节点并将XML片段附加到新的XML文档中。

加载外部XML/读取片段:

DOMXpath::evaluate()允许使用XPath表达式从XMLDOM中获取节点和值。

$outer = new DOMDocument();
$outer->loadXml($xml);
$xpath = new DOMXPath($outer);
$innerXml = $xpath->evaluate('string(/configuration/onglet/wysiwyg/code)');
echo $innerXml;

输出:

<p>test</p>            
<p><graphique drawer="Line" interval="2" periode="semaine" titre="test" type="Relative">
  <serie marqueur="Normal">
    <index serial="---" type="di">3</index>
    <typegroupe></typegroupe>
    <intervalgroup></intervalgroup>
    <periodgroup></periodgroup>
    <groupverif>non</groupverif>
    <unite>Kwh</unite>
    <legend>test2</legend>
    <color>#000000</color>
  </serie>
</graphique></p>

加载XML片段

XML文档只有一个根/文档元素节点,因此本例中的XML是一个片段。为了便于阅读,它需要一个根节点。因此,让我们创建一个带有body节点的文档,并将片段附加到其中:

$inner = new DOMDocument();
$inner->appendChild($inner->createElement('body'));
$fragment = $inner->createDocumentFragment();
$fragment->appendXml($innerXml);
$inner->documentElement->appendChild($fragment);
echo $inner->saveXml();

输出:

<?xml version="1.0"?>
<body>
  <p>test</p>            
  <p><graphique drawer="Line" interval="2" periode="semaine" titre="test" type="Relative">
    <serie marqueur="Normal">
      <index serial="---" type="di">3</index>
      <typegroupe></typegroupe>
      <intervalgroup></intervalgroup>
      <periodgroup></periodgroup>
      <groupverif>non</groupverif>
      <unite>Kwh</unite>
      <legend>test2</legend>
      <color>#000000</color>
    </serie>
  </graphique></p>
</body>

元素名称无关紧要,但body适合p元素。

从新文档读取数据

现在可以为文档创建一个DOMXPath实例并从中获取数据

$xpath = new DOMXPath($inner);
foreach ($xpath->evaluate('//graphique') as $graphique) {
  var_dump(
    [
      'drawer' => $graphique->getAttribute('drawer'),
      'serie-color' => $xpath->evaluate('string(serie/color)', $graphique)
    ]
  );
}

输出:

array(2) {
  ["drawer"]=>
  string(4) "Line"
  ["serie-color"]=>
  string(7) "#000000"
}