根本原因 xml 文件中的属性无法通过简单 xml php 加载
attributes in root cause xml file to not load by simplexml php
所以,这是我之前已解决的问题的后续问题,下面是 link:
感谢@RomanPerekhrest 解决了这个问题。
我有这段 php 代码使用简单xml 来读取我的 xml 文件
<?php
$xml = simplexml_load_file('../uploads/reports/report.xml');
$hits = $xml->xpath("results/hits/@rule_id");
$ruleIds = array_map(function($v){ // getting search path for each needed rule
return "profile_info/rules/rule[@id='". (string)$v. "']";
}, $hits);
foreach ($xml->xpath(implode(" | ", $ruleIds)) as $rule) {
echo '<div id="name">'. $rule->display_name .'</div>'.
'<div id="comment">'. $rule->display_comment .'</div>';
}
?>
再次感谢@RomanPerekhrest 提出这个建议。
这段代码适用于我创建的简化 xml 文件,以说明我在之前的问题中遇到的问题,但是当我应用它时,它似乎没有呈现。
我找到了原因,在我的根元素中有一些 xmlns 属性导致我的 xml 无法加载。当我手动删除这些属性时,一切都按预期工作。 (我不会列出整个 xml 文档,因为它有 8500 多行)
这是具有属性的根元素:
<report xsi:schemaLocation="http://www.callassoftware.com/namespace/pi4 pi4_results_schema.xsd" xmlns="http://www.callassoftware.com/namespace/pi4" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
我需要一种绕过 php 的方法。鉴于这些xml文件是由其他软件生成的,而且这一代没有设置,我不能简单地制作没有这些属性的xml文件。
谢谢
您的XML在根元素中声明了默认命名空间,不带前缀的后代元素隐式继承:
xmlns="http://www.callassoftware.com/namespace/pi4"
要在默认命名空间中引用元素,您需要将前缀映射到默认命名空间 URI,然后在您的 XPath 中使用该前缀:
//register prefix 'd' to reference default namespace URI
$xml->registerXPathNamespace('d', 'http://www.callassoftware.com/namespace/pi4');
//use the prefix to reference elements in the default namespace
$hits = $xml->xpath("d:results/d:hits/@rule_id");
$ruleIds = array_map(function($v){ // getting search path for each needed rule
return "d:profile_info/d:rules/d:rule[@id='". (string)$v. "']";
}, $hits);
所以,这是我之前已解决的问题的后续问题,下面是 link:
感谢@RomanPerekhrest 解决了这个问题。
我有这段 php 代码使用简单xml 来读取我的 xml 文件
<?php
$xml = simplexml_load_file('../uploads/reports/report.xml');
$hits = $xml->xpath("results/hits/@rule_id");
$ruleIds = array_map(function($v){ // getting search path for each needed rule
return "profile_info/rules/rule[@id='". (string)$v. "']";
}, $hits);
foreach ($xml->xpath(implode(" | ", $ruleIds)) as $rule) {
echo '<div id="name">'. $rule->display_name .'</div>'.
'<div id="comment">'. $rule->display_comment .'</div>';
}
?>
再次感谢@RomanPerekhrest 提出这个建议。
这段代码适用于我创建的简化 xml 文件,以说明我在之前的问题中遇到的问题,但是当我应用它时,它似乎没有呈现。
我找到了原因,在我的根元素中有一些 xmlns 属性导致我的 xml 无法加载。当我手动删除这些属性时,一切都按预期工作。 (我不会列出整个 xml 文档,因为它有 8500 多行) 这是具有属性的根元素:
<report xsi:schemaLocation="http://www.callassoftware.com/namespace/pi4 pi4_results_schema.xsd" xmlns="http://www.callassoftware.com/namespace/pi4" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
我需要一种绕过 php 的方法。鉴于这些xml文件是由其他软件生成的,而且这一代没有设置,我不能简单地制作没有这些属性的xml文件。
谢谢
您的XML在根元素中声明了默认命名空间,不带前缀的后代元素隐式继承:
xmlns="http://www.callassoftware.com/namespace/pi4"
要在默认命名空间中引用元素,您需要将前缀映射到默认命名空间 URI,然后在您的 XPath 中使用该前缀:
//register prefix 'd' to reference default namespace URI
$xml->registerXPathNamespace('d', 'http://www.callassoftware.com/namespace/pi4');
//use the prefix to reference elements in the default namespace
$hits = $xml->xpath("d:results/d:hits/@rule_id");
$ruleIds = array_map(function($v){ // getting search path for each needed rule
return "d:profile_info/d:rules/d:rule[@id='". (string)$v. "']";
}, $hits);