【问题标题】:Editing XPATH results do not affect document编辑 XPATH 结果不影响文档
【发布时间】:2017-03-09 15:47:10
【问题描述】:

我目前在使用 SimpleXML 时遇到了一个小问题。我不知道为什么,但由于某种原因,它没有将我的更改保存在 XML 文件中。

<?xml version="1.0" encoding="ISO-8859-1"?>
<KW10>
  <dienstag date="07.03.2017">
    <arbeitszeit/>
    <pausen/>
    <kilometer/>
    <fahrer/>
    <hotel/>
    <fahrtzeit_hin/>
    <fahrtzeit_weg/>
    <erledigt/>
  </dienstag>
  <mittwoch date="08.03.2017">
    <arbeitszeit/>
    <pausen/>
    <kilometer/>
    <fahrer/>
    <hotel/>
    <fahrtzeit_hin/>
    <fahrtzeit_weg/>
    <erledigt/>
  </mittwoch>
  <donnerstag date="09.03.2017">
    <arbeitszeit/>
    <pausen/>
    <kilometer/>
    <fahrer/>
    <hotel/>
    <fahrtzeit_hin/>
    <fahrtzeit_weg/>
    <erledigt/>
  </donnerstag>
  <freitag date="10.03.2017">
    <arbeitszeit/>
    <pausen/>
    <kilometer/>
    <fahrer/>
    <hotel/>
    <fahrtzeit_hin/>
    <fahrtzeit_weg/>
    <erledigt/>
  </freitag>
  <samstag date="11.03.2017">
    <arbeitszeit/>
    <pausen/>
    <kilometer/>
    <fahrer/>
    <hotel/>
    <fahrtzeit_hin/>
    <fahrtzeit_weg/>
    <erledigt/>
  </samstag>
  <sonntag date="12.03.2017">
    <arbeitszeit/>
    <pausen/>
    <kilometer/>
    <fahrer/>
    <hotel/>
    <fahrtzeit_hin/>
    <fahrtzeit_weg/>
    <erledigt/>
  </sonntag>
    <montag date="06.03.2017">
        <arbeitszeit von="21:00" bis="05:00"/>

        <kilometer/>
        <fahrer is="true"/>
        <hotel/>
        <fahrtzeit_hin von="20:30" bis="20:45"/>
        <fahrtzeit_weg von="05:15" bis="05:30"/>
        <erledigt/>
        <pausen>
            <pause_0 von="23:30" bis="00:00"/>
        </pausen>
    </montag>
</KW10>

我想对 xml 文件进行排序以按顺序(按日期)获取工作日

$xml = simplexml_load_file('users/'.$_SESSION['vorname'].$_SESSION['nachname'].'/'.$kw.'.xml');
$trees = $xml->xpath('//*[@date]');
usort ($trees, function($a, $b) { return strcmp($a['date'], $b['date']); });
echo '<pre>'; print_r($trees); echo '</pre>';
$xml->asXML('kwtest.xml');

输出很好,但由于某种原因它不会保存我对文件的更改,它会创建文件但使用旧的 xml 树,所以我想我必须以某种方式应用我的排序树(当然覆盖)。

这里有人有答案吗?

【问题讨论】:

  • 在执行$trees = $xml-&gt;xpath('//*[@date]'); 之后,$trees 是一个与$xml 没有连接的结果数组。你必须从 $trees 中创建一个真正的 simple_xml 对象。
  • 您理所当然地认为SimpleXMLElement::xpath() 返回的SimpleXMLElement 对象数组链接到原始SimpleXMLElement。文档对此只字未提,这可能是一个过分的假设。
  • 在这里阅读它是如何完成的:stackoverflow.com/questions/23105465/… 在答案中寻找//Replace old elements with new
  • 另外,最好使用&lt;day weekday="montag" date="12.03.2017"&gt; 之类的节点,如果可以更改,请这样做。之后,您可以查找节点day 而不是属性date

标签: php sorting xpath simplexml


【解决方案1】:

所以你可以做的是:

//After creating sorted $trees generate a new xml 
$newXml = '';
foreach($trees as $t){
    $newXml .= $t->asXML().PHP_EOL;
}
#merge that with header and root-node
$newXml = simplexml_load_string('<?xml version="1.0" encoding="ISO-8859-1"?>
<KW10>
'.$newXml.'
</KW10>');
#now it looks like
echo '<pre>'; print_r(htmlentities($newXml->asXML())); echo '</pre>';
#save it, maybe unlink the old version before
$newXml->asXML('kwtest.xml');

【讨论】:

    猜你喜欢
    • 2013-11-15
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多