XML或PHP或某人正在吃我的角色

时间:2017-09-21 20:21:54

标签: php xml

我是远离被禁止访问网站的一个不好的问题,但是这个对我来说是值得的,我花了好几个小时试图找到问题并调试它,我根本不能,我我已经搜索了高低的答案,而且我一无所知

我正在使用PHP DOM Document Parser Object,我正在导入Wikipedia XML模板。几个小时我一直在使用substr(),我的答案就像14个左右的字符一样。因此,简而言之,事实证明,这种差异来自>并且<我有一些元素

我已经尝试了我能想到的一切,一切都是UTF-8,我尝试过类型转换为字符串,我的标题不是作为XML发送的,它是一个普通的HTML输出,我试过了,我已经尝试过mb_substr()和substr()

str_replace('<', '&lt;', $string);

无论我做什么都无法阻止那些角色消失在深渊中,但我不知道他们要去哪里

希望有人可以对此有所了解

编辑: 为了清理它,我直接从维基百科下载了一个XML文件,其中一行就是:

&lt;small&gt;(1, 2, 3, 4, 33, 34, 64, 65, 66)&lt;big&gt;&lt;br/&gt;

现在如果我使用:

dd(mb_substr($str, 1, 2))

我希望“LT”,但实际上我得到的是“sm”,它正在处理“&lt;”作为单个字符,但如果我在Sublime,Notepad ++,EmEditor等中打开文件,则为4个字符

我不明白PHP如何处理字符串,即使我使用str_replace()它也拒绝成为HTML实体

EDIT2:

如果你去这个地址:

https://en.wikipedia.org/wiki/Special:Export

并在框中输入“London”,它将下载一个XML文件

在课堂上或使用此代码时,请使用以下代码:

    $this->file = new \DOMDocument;
    $this->file->load('C:\path-to-your-xm-file.xml');
    $pages = $this->file->getElementsByTagName('page');

    foreach($pages as $page)
    {
        die(mb_substr($page->getElementsByTagName('text')->item(0)->nodeValue, 343, 1));
    }

现在第344个字符应该是&符号,但是它给出了整个“&lt;”

1 个答案:

答案 0 :(得分:2)

据我所知,它是关于XML解析器的。 按照XML标准,必须将三个字符编码并解码为:

‘< ‘ to &lt;

> to &gt;

& to &amp;

然后任何(和所有)解析器必须执行下一步:

  1. 假设您需要将文本节点(或属性值)设置为字符串为 < my text & some more >

  2. 然后假设它是XML标记中的文本节点<TextValue>

  3. 根据XML标准,此类文本可以以两种形式呈现在XML文档中: <TextValue>&lt; my text &amp; some more &gt;</TextValue>

    <TextValue><![CDATA[<my text & some more>]]></TextValue>

    1. 现在任何必须从两个演示文稿中返回文本节点值的解析器都必须返回实际的字符串值,而不是XML编码的演示文稿。
    2. 因为实际的字符串是< my text & some more >解析器执行XML解码并返回实际的字符串值。
    3. 它与实际的Parser实现(浏览器中的PHP,Java,DOM或其​​他任何内容无关。它是标准。

      PS。如果您手头有任何具有XPath功能的XML工具,您可以使用该示例并完全看到已定义的行为。

      UPD:所以您的XML演示文稿是:&lt;small&gt;(1, 2, 3, 4, 33, 34, 64, 65, 66)&lt;big&gt;&lt;br/&gt;

      然后实际的字符串为<small>(1, 2, 3, 4, 33, 34, 64, 65, 66)<big><br/> 当然,字符串长度为49而不是67,mb_substr($str, 1, 2)从实际字符串值返回sm,而不是从XML编码表示中返回lt