- 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/
我已经下载了草莓 PERL 并在 Winxp sp3 上使用 CGI Perl Apache 编写了一个应用程序。我使用的库之一(由其他人编写)使用 XML::LibXML。当我加载页面时,它给出内部
libxml 在 libxml.h 中使用以下代码行,但它不与 libxml 捆绑在一起。 #include "config.h" 我正在尝试在 Swift 中使用 XMPPFramework for
我知道这个问题经常出现,但我查看了所有其他答案,但没有一个与我相关。 我正在尝试从源代码编译神经成像软件 FSL(我必须这样做,我的 Linux 发行版不支持它)。我已按照所有说明进行操作 liste
当我运行 cyrus-imapd-2.4.17-caldav-beta9 时出现以下错误: In file included from httpd.c:68:0: httpd.h:48:25: fat
我熟悉 XML,已经将它用于一些简单的用途。但是,我被要求创建一个自定义解决方案(必须使用 Perl)来向 AuthorizeNet 的网关提交付款。 AuthNet 不提供对 Perl 的支持,所以
我有一个示例 Perl 脚本,我试图根据模式加载和验证文件,它们询问各种节点。 #!/usr/bin/env perl use strict; use warnings; use XML::LibXM
我有我正在迭代的非常大的 XML 文档。 XML 主要使用属性而不是节点值。我可能需要在文件中找到许多节点来拼凑一组信息。它们通过不同的 ref 标签值联系在一起。目前,每次我需要定位其中一个节点以从
我正在使用 XML::LibXML,我想添加一条注释,使注释位于标签之外。甚至可以把它放在标签外面吗?我试过 appendChild,insertBefore |之后,没有区别... jun
我正在使用 XML::LibXML,我想添加一条注释,使注释位于标签之外。甚至可以把它放在标签外面吗?我试过 appendChild,insertBefore |之后,没有区别... jun
我正在尝试使用 ISO-8859-1 中的 libxml2 编写 XML 文件。但从文档看来,对于我创建的每个文本节点,我都必须转换为 UTF-8,这是 libxml 的内部编码。然后,当调用 xml
我正在尝试用 C++ 解析 XML 文档。我没有与文档关联的任何形式的元数据。由于我是 XML 的新手,所以我想了解解析此 xml 的最佳方法。我正在使用 libxml2 来实现这一点。 我目前正在做
使用 libxml2 两天后我就遇到了一个问题,这让我很烦。 基本上,我使用套接字通过网络发送一个 xml 缓冲区。当我在服务器上收到它并尝试解析它时,它说: parser error : Input
我正在使用 libxml 的 HTML 解析器来创建 html 文档的 dom 树。 libxml 将每个节点的文本内容作为一个整体字符串(节点)给出,但我的要求是进一步拆分每个文本节点的空格并创建尽
我已经开始在 C 中使用 libxml,并且正在使用 xmlXPathEvalExpression 函数来计算 XPath。 我的 XML 文件实际上代表一个表,每个子节点代表该表中的一行,其属性是对
我有一个可以通过终端运行的源文件 gcc source.c -I/usr/include/libxml2 -lxml2 -o output 但是当我 #include 包含 libxml 源文件的源文
这里似乎有些奇怪。 在下面的示例中,我通过 XPath 查询 ( //book/isbn/text() ) 访问文本节点。 text()有必要强制XML::LibXML允许我使用 XML::LibXM
我有一个 XML 文件,如下 示例.xml test 以下代码未找到 id 标记值: use XML::LibXML; my $filename = 'example.xml'; my
我正在与 XML::LibXML 一起工作在 Perl 中。 假设我有两个 $element由不同(不透明)XPath 查询获得的引用。 (如何)我可以确定,如果两个$element (节点)refs
我有一个问题,我肯定可以使用一些帮助。首先,要温柔。我是 perl 和 LibXML 的新手。我一直在解析文档并将元素放入一个数组中,然后将其写入电子表格列。在测试过程中发现一些节点有多个同名的子节点
在我的一生中,我无法找出正确的代码来访问我的 XML 文件中的注释行。我是否使用 findnodes , find , getElementByTagName (怀疑)。 我是否正确假设这些评论行是可
我是一名优秀的程序员,十分优秀!