【问题标题】:Remove XML Node from a file loaded using PHP filesystem [duplicate]从使用 PHP 文件系统加载的文件中删除 XML 节点 [重复]
【发布时间】:2018-06-17 14:34:17
【问题描述】:

我有一个使用 PHP 的 file_get_contents 读取的 XML 文件,因此可以对其进行其他更改。

我需要在整个文件中找到并删除节点<BATCHALLOCATIONS.LIST>...<BATCHALLOCATIONS.LIST>(不仅仅是这两行,而是整个节点之间的内容)。

由于文件已经使用file_get_contents 加载,我想这样做,而不必使用simpleXML、XML 解析器或任何其他方法(如 DOM)再次加载文件。

节点没有特定的父节点,随机出现。

XML 文件是从商业会计软件中导出的。

关于如何实现这一点的任何想法?也许使用正则表达式进行搜索和替换或类似的事情?

我一直在尝试使用正则表达式和 preg_replace 来执行此操作,但无法正常工作。

Here's just a portion of the file。原始运行到 10K+ 行。

这应该有效,但没有

preg_replace('/^\<BATCHALLOCATIONS.LIST\>(.*?)\<\BATCHALLOCATIONS.LIST\>$/ism','', $newXML);

我正在尝试在不使用任何 HTML/XML 解析器的情况下执行此操作。

【问题讨论】:

  • 不要使用正则表达式来更改 XML 文件。请改用 lxml 或其他一些 XML 解析器。
  • @zx485 ... lxml 是 Python 库,而不是 PHP。 OP 应该使用 DOMDocument 或 SimpleXML 类。
  • 当然你是对的。对于这个错误,我深表歉意。

标签: php regex xml preg-replace


【解决方案1】:

可能有更好的方法,但这会奏效

// get your file as a string 
$yourXML = file_get_contents($file) ;

$posStart = stripos($yourXML,'<BATCHALLOCATIONS.LIST>') ;
$posEnd = stripos($yourXML,'</BATCHALLOCATIONS.LIST>') + strlen('</BATCHALLOCATIONS.LIST>') ;

$newXML = substr($yourXML,0,$posStart) . substr($yourXML,$posEnd) ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    相关资源
    最近更新 更多