我有一个这样的xml:
<father>
<son>Text with <b>HTML</b>.</son>
</father>
我正在使用simplexml_load_string将其解析为SimpleXmlElement。然后我像这样得到我的节点
$xml->father->son->__toString(); //output: "Text with .", but expected "Text with <b>HTML</b>."
我需要处理简单的超文本标记语言,例如:
我的问题是,我不能仅仅要求他们使用CDATA,因为他们无法正确处理它,而且他们已经习惯了没有CDATA。此外,如果可能的话,我不希望文件被编辑,因为信息需要是用户发送的。
函数simplexml_load_string只需删除HTML节点和HTML节点本身内部的任何内容。我如何保存这些信息?
解决方案
为了解决这个问题,我使用了asXml,正如@ThW所解释的:
$tmp = $xml->father->son->asXml(); //<son>Text with <b>HTML</b>.</son>
我刚刚添加了一个preg_匹配来擦除节点。
CDATA节是字符节点,就像文本节点一样。但它的编码/解码功能较少。实际上,这主要是一个缺点。从正面来看,CDATA部分中的某些内容对人来说可能更具可读性,并且在特殊情况下允许使用某些BC。(想想HTML脚本标记。)
对于XMLAPI,它们几乎是相同的。下面是一个小的DOM示例(SimpleXML非常抽象)。
$document = new DOMDocument();
$father = $document->appendChild(
$document->createElement('father')
);
$son = $father->appendChild(
$document->createElement('son')
);
$son->appendChild(
$document->createTextNode('With <b>HTML</b><br>It\'s so nice.')
);
$son = $father->appendChild(
$document->createElement('son')
);
$son->appendChild(
$document->createCDataSection('With <b>HTML</b><br>It\'s so nice.')
);
$document->formatOutput = TRUE;
echo $document->saveXml();
输出:
<?xml version="1.0"?>
<father>
<son>With <b>HTML</b><br>It's so nice.</son>
<son><![CDATA[With <b>HTML</b><br>It's so nice.]]></son>
</father>
正如您所看到的,它们的序列化方式非常不同——但从API视图来看,它们基本上是可交换的。如果您使用的是XML解析器,那么在这两种情况下返回的值应该相同。
因此,第一种可能是让HTML片段存储在字符节点中。它只是外部XML文档本身的字符串值。
另一种方法是使用XHTML。XHTML是与XML兼容的HTML。您可以混合匹配不同的XML格式,因此可以添加XHTML片段作为外部XML的一部分。
这似乎就是你收到的。但是SimpleXML在混合节点方面存在一些问题。下面是一个如何在DOM中读取它的示例。
$xml = <<<'XML'
<father>
<son>With <b>HTML</b><br/>It's so nice.</son>
</father>
XML;
$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXpath($document);
$result = '';
foreach ($xpath->evaluate('/father/son[1]/node()') as $child) {
$result .= $document->saveXml($child);
}
echo $result;
输出:
With <b>HTML</b><br/>It's so nice.
基本上,您需要将son
元素的每个子元素保存为XML。
SimpleXML内部基于相同的DOM库。这允许您将SimpleXMLElement转换为DOM节点。从那里,您可以再次将每个子级保存为XML。
$father = new SimpleXMLElement($xml);
$sonNode = dom_import_simplexml($father->son);
$document = $sonNode->ownerDocument;
$result = '';
foreach ($sonNode->childNodes as $child) {
$result .= $document->saveXml($child);
}
echo $result;
问题内容: 我有一个XML文件test.xml 我正在尝试在表单提交中使用PHP更新节点xName和yName。因此,我已经使用simplexml_load_file()加载了文件。PHP表单操作代码如下 我想更新节点值,但是上面的代码似乎不正确。谁能帮助我纠正它? 更新:我的问题有点类似于使用PHP更新XML文件,但是在这里,我要从外部文件加载XML,同时还要更新元素而不是属性。那就是我的困惑所
我像这样使用复制命令 cp VID1.MP4 VID2.MP4 它成功地将vid1复制到VID2中。 /users/neerpatel/desktople/testprojects/childprocess/index.js:7抛出错误;^ 错误:命令失败:ffmpeg-i input.mp4-i logo.png-filter_complex“overlay=10:10”output.mp4 您
我正在使用dialogflow节点SDK向dialogflow发送textRequests和eventRequests。fulfillment webhook显示,尽管sessionId相同,但上下文没有被保留。使用GoogleAssistant上的actions中的同一个dialogflow代理时,上下文将被保留。所以唯一的区别是我使用NodeSDK发送文本。 第二个请求不会触发INTENT_2
问题内容: 我正在尝试从XML提取一些数据,但是当我执行以下命令时,我得到了一个 警告:为…中的foreach()提供了无效的参数 代码示例: 对于单个单词的节点名称,它可以很好地工作,所以我猜它不喜欢连字符。我需要逃脱吗? 问题答案: 从PHP 手册: 访问XML文档中包含PHP命名约定不允许的字符的元素(例如,连字符)可以通过将元素名称封装在花括号和撇号中来实现。 您的情况是:
我有一个XML文件: 我想使用XSLT将其转换为have: 我的文件: 但是我的输出文件中没有根节点。如何做到这一点? 还有,这是一个好的方法来进行转换吗?堆叠几个模板?
我目前正在为XML文档流开发一个自定义管道组件,其中根节点和该根节点的第一个子节点需要剥离,只剩下第二个子节点(现在是新的根节点)。 我正在使用XDocumt作为XML文档的容器类。我写了一些代码,获取第二个子节点,并创建一个新的XML文档,将该节点作为根节点,从而从图片中删除两个不需要的节点。 但是当我在Biztalk中测试这个设置时,我只得到一个空文档作为响应。它似乎创建了一个空的XML文档,