我的项目是使用CKEditor并创建一个插件在页面内创建图表,以显示结果(在CKEditor中,当您使用插件时,只会出现一个img)。
插件已经创建,当您使用它时,将在CKEditor中创建具有所需值和属性的XML。因此,图表的XML与书写文本一起存在(CKEditor的格式为<p>
)。
当您在CKEditor中保存时,XML和HTML形式的文本将在字符串中发送到数据库(当我从CKEditor检索数据时,它会发送一个字符串)。
在数据库中,它是这样存储的:
<?xml version="1.0"?>
<configuration>
<onglet pos="1" name="test">
<wysiwyg>
<code>
<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>
</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"
}