- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 LIBXML* 常量作为 SimpleXMLElement
的第二个参数构造函数,但它们根本不改变任何东西。
$xml = '<root><empty_tag/><foo></foo></root>';
$simpleXml = new SimpleXMLElement($xml, LIBXML_NOENT|LIBXML_NOXMLDECL|LIBXML_NOEMPTYTAG);
$simpleXml->foo = 'Ņ';
echo $simpleXml->asXML();
预期:
<root><empty_tag></empty_tag><foo>Ņ</foo></root>
实际:
<?xml version="1.0"?>
<root><empty_tag/><foo>Ņ</foo></root>
正如您所看到的,这些标志中没有一个执行任何操作 - 实体仍然被转义(即使 XML 应该只根据 https://www.w3.org/TR/xml/#syntax 转义 "'&><
),XML 声明仍然存在,并且空的标签保持为空。有没有办法使用 SimpleXML 达到预期的结果?或者至少只转义 5 个特殊字符? addChild()
此处不是一个选项,我正在分配现有节点。
最佳答案
这些常量的命名可能有点神秘。那么实际上支持什么?
实体是作为实体引用添加到文档中还是已展开。需要通过加载文档来指定:
<?php
$xml = '<!DOCTYPE test [<!ENTITY c "TEST">]>
<test>&c;</test>';
echo (new SimpleXMLElement($xml))->asXML(), "\n";
echo (new SimpleXMLElement($xml, LIBXML_NOENT))->asXML(), "\n";
这显示了第一个输出:
<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY c "TEST">
]>
<test>&c;</test>
实体被保留。对于第二个回显,使用 LIBXML_NOENT
:
<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY c "TEST">
]>
<test>TEST</test>
XML 借自相关问答:What does LIBXML_NOENT do (and why isn't it called LIBXML_ENT)?
顺便说一下,这与文档中的非 US-ASCII 字符无关。如果您需要包含该文档,请将编码设置为 UTF-8,例如:
$xml = '<root><empty_tag/><foo></foo></root>';
$simpleXml = new SimpleXMLElement($xml);
dom_import_simplexml($simpleXml)->ownerDocument->encoding = 'UTF-8';
$simpleXml->foo = 'Ņ';
echo $simpleXml->asXML();
这里的技巧是 set the encoding in the underlying DOMDocument
,这是我知道的 SimpleXMLElement
(和 DOMDocument
)的唯一方法。这里的输出:
<?xml version="1.0" encoding="UTF-8"?>
<root><empty_tag/><foo>Ņ</foo></root>
您再也看不到 Ņ
实体,而只是 Unicode(UTF-8 编码)形式的 Ņ
。 XML declaration 现在还显示编码。
根据您的问题,我认为这就是您正在寻找的LIBXML_NOENT
。
列表中的第二个。我从来没有让它工作过,它有错误和/或有一些特定的版本要求,但老实说我什至不知道是否/在哪里有意应用它。
您可以从输出中删除包含 XML 声明的第一行(始终以“\n
”结尾)。
或者您可以再次与底层 DOMDocument
相关以输出文档元素,这样它就不是完整的文档,因此没有 XML 声明:
$dom = dom_import_simplexml($simpleXml)->ownerDocument;
echo $dom->saveXML($dom->documentElement);
输出:
<root><empty_tag/><foo>Ņ</foo></root>
这基本上是 remove xml version tag when a xml is created in php 中建议的内容。
列表中的第三个也是最后一个。我现在可以引用 PHP 手册,但这已经在其他地方完成了 on site already 但无论如何,如何使用 SimpleXMLElement
执行此操作,而不管常量不可用?
一种方法是再次通过 DOMDocument
提供选项:
$dom = dom_import_simplexml($simpleXml)->ownerDocument;
echo $dom->saveXML($dom->documentElement, LIBXML_NOEMPTYTAG);
输出:
<root><empty_tag></empty_tag><foo>Ņ</foo></root>
或者为了执行此“纯”SimpleXML,在每个空元素中添加一个空文本节点:
$xml = '<?xml version="1.0" encoding="UTF-8"?><root><empty_tag/><foo></foo></root>';
$simpleXml = new SimpleXMLElement($xml);
$simpleXml->foo = 'Ņ';
foreach ($simpleXml->xpath('//*[not(*) and string() = ""]') as $empty) {
$empty[0] = '';
}
echo $simpleXml->asXML();
即在foreach
中,获取每个xpath查询的所有空元素,然后将其文本内容设置为空字符串,如果有的话,将在其中插入一个文本节点还没有(一个空的)。输出:
<?xml version="1.0" encoding="UTF-8"?>
<root><empty_tag></empty_tag><foo>Ņ</foo></root>
我希望这能为您提供所需的选择。
关于php/simplexml - LIBXML 选项被忽略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58375610/
这里发生了什么事? $string = XML; $xml = simplexml_load_string($string); // $xmlobj = sim
当我将 SimpleXML 解析为对象数组的一部分的字符串时,我一直坚持让 SimpleXML 返回一个对象。 $a = '1145869290false43false'; $resultA = si
我有两个 SimpleXML 对象。如何将一个对象添加为另一个对象的子元素。 请注意,这不能通过 addChild 方法完成,因为它会在添加之前将给定值转换为字符串。 最佳答案 我发现 SimpleX
http://pastie.org/1701923这是从我查询邮政编码的 API 返回的 XML。 我想从每个条目中提取数据,然后直接对其进行循环或将其放入我可以循环的数组中。我似乎无法正确处理。这是
这个问题在这里已经有了答案: remove xml version tag when a xml is created in php (10 个答案) 关闭 7 年前。 我使用 SimpleXML
与 DOM 或 Expat 解析器相比,SimpleXML 仅仅用几行代码就可以从 XML 元素中读取文本数据。 SimpleXML 可把 XML 文档(或 XML 字符串)转换为对象,比如:
我有一些看起来像这样的 XML: true 42 ;jsessionid=42 SimpleXML 以这种方式解析它: $obj
我有一个具有命名空间属性的 XML 文档。 XML 看起来像: 我如何提取 and
我想从元素id的属性创建一个数组,但是以下代码返回所有XML。 PHP文件: $xmlfile=simplexml_load_file("test.xml"); $test=$xmlfile->xpa
我有一个看起来像这样的XML结构: 0 Some survey question Answer 1 0 Answ
我正在尝试访问具有命名空间声明的节点中没有命名空间声明的节点列表。我的 XML 文件有一个带有命名空间 ehd 的主节点,在同一命名空间内有两个子节点 header、body。但是,主体节点内的所有子
我正在使用 SimpleXML 和 XPath 尝试获取子节点('IndexEntry)属性('indexKey')的值。节点的命名空间,我已在另一个节点(“记录”)上成功测试。由于某种原因,该节点的
我有两棵 XML 树,想将一棵树作为叶子添加到另一棵树上。 显然: $tree2->addChild('leaf', $tree1); 不起作用,因为它仅复制第一个根节点。 好吧,所以我想我应该遍历整
我正在使用 SimpleXML http://simple.sourceforge.net/home.php 在我的 Android 应用程序中, 我从 API 获取数据如下:
我想使用 SimpleXML 读取并解析包含员工信息的 XML 文件。框架。这是我的 XML 文件: 29 Pankaj
我正在尝试在 android 中使用 simplexml 解析此 xml 字符串: " " 是的,我知道门标签应该立即关闭,而不是在声明所有门标签后关闭,我无法控制这个
我有一个具有这种结构的 XML 文件:
请,我需要解析包含汽车信息的 XML 文件。我在汽车、照片中完成了所有操作,但我需要在额外的表中包含 id、汽车表 id 的外键,并且所有汽车都有随机的 Equipment_id。 我需要将其放入“设
我有一个看起来像这样的 xml: 在 xml 映射 java 代码中我有这样的东西: public class A { @Element(required=false)
我有一个xml文档如下: Calculations Description First Description Alan
我是一名优秀的程序员,十分优秀!