【问题标题】:Parsing XML tags with hyphens not working as expected使用连字符解析 XML 标记未按预期工作
【发布时间】:2016-07-15 09:32:59
【问题描述】:

部分感谢 SO,我能够弄清楚如何使用连字符 () 访问 XML 标记。我见过的所有例子都是这样的。

$content = $xml->{'document-content'};

但对我来说这行不通,而这行

$content = $xml->{document-content};

那是没有引号的(我是怎么想出来的,我不记得了,可能是一个错误)。如果我使用引号,我会收到此错误

注意:试图在第 26 行的 /html/my/dir/myfile.php 中获取非对象的属性

所以人们会认为只使用它而不使用引号。当然,直到我找到解析 XML 的原因。 XML 来自 ODT 文件,最终将用作生成 PDF 的模板。在开发任何东西时,我总是使用“E_ALL”错误报告。设置它后,当我在不带引号的情况下使用它时会出现这 2 个错误。

注意:使用未定义的常量文档 - 在第 24 行 /html/my/dir/myfile.php 中假定为“文档”

注意:使用未定义的常量内容 - 在第 24 行 /html/my/dir/myfile.php 中假定为“内容”

但是,它确实可以很好地解析文档的其余部分。问题是我需要创建一个 PDF,如果它在运行“标题”的 PDF 生成器之前输出“通知”错误,则没有正确设置并且没有创建 PDF。现在有人可能会建议我关闭错误报告,但如果 PDF 不工作,我就看不到这些错误。

事实上,我不知道为什么它在没有引号的情况下完全有效。我所知道的关于 PHP 语法的一切都表明,如果没有引号,它将是一个常量(如错误指出的那样),必须在它之前的某个地方定义。因此,此时整个解析器应该会失败,但它不会,事实上,解析器的工作情况正好相反。

大多数情况下,我只需要知道如何在不禁用错误报告的情况下消除这 2 个通知错误。而且我会对它为什么不带引号工作很感兴趣,因为它的工作方式似乎大大偏离了所有编程规范。

以防万一这里需要的是导致“$content”的所有代码

$zip = new ZipArchive;

if ($zip->open('../docs/myfile.odt') === true)
{
    $xmlstring = $zip->getFromName('content.xml');
    $zip->close();
}

// remove all namespaces and swaps out tab and space tags
$replace = array('office:', 'style:', 'draw:', 'fo:', 'text:', 'svg:', '<tab/>', '<s/>');
$value = array('', '', '', '', '', '', "\t", '&#160;');
$xmlstring = str_replace($replace, $value, $xmlstring);

$xmlstring = preg_replace_callback('/<s c="(.+?)"\/>/s', 'ReplaceSpaces', $xmlstring);

$xml = simplexml_load_string($xmlstring);
$content = $xml->{document-content};

【问题讨论】:

  • 您将 XML 解析与通用 PHP 语法、字符串操作和其他一些问题混合在一起。您不需要“只需要摆脱错误消息”。 document-content 将从字符串document 中减去字符串content - 结果是0。零不是有效的标记名称,不能存在于 XML 中。
  • 所以基本上它正在获取 xml 对象“0”???所以我给了$xml-&gt;{0},在我的代码中尝试一下,它也可以工作,并且没有错误消息。所以你间接解决了这个问题。但是我仍然对解释为什么 XML 解析起作用很感兴趣。你的最后一句话似乎暗示我的代码不应该工作。我同意它不应该这样做,那为什么它会起作用?
  • 它不工作。第一条错误消息说 $content 不是对象。分离一个封装你源代码的不同部分并调试它。

标签: php xml xml-parsing odt odf


【解决方案1】:

我应该踢自己,多年来我已经解析了很多 XML 文件和 RSS 提要,答案很简单。在使用 SimpleXML 时,您确实不需要引用 XML 的主要元素。

<document-content>
    <tag1>
    </tag1>
    <tag2>
        <anothertag>
        </anothertag>
    </tag2>
</document-content>

所以$xml-&gt;{document-content}-&gt;tag2(或$xml-&gt;{0}-&gt;tag2)与$xml-&gt;tag2完全相同

我猜这是我第一次使用 odt 文件,并且不得不处理它的一些麻烦,我忽略了显而易见的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-22
    • 2017-12-14
    • 1970-01-01
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    相关资源
    最近更新 更多