【问题标题】:need to add carriage returns after each xml element (php)需要在每个 xml 元素后添加回车符(php)
【发布时间】:2012-03-27 11:12:35
【问题描述】:

我有一个通过 https 发送的文件,我正在使用 php 脚本进行处理。

使用以下方式接受数据:

$data = file_get_contents('php://input')

如果写入文件,则写入一行。

由于我们的内部系统(IBM power 7),IT 告诉我,我需要在每个 xml 元素后添加一个回车。

所以文件当前在编辑器中打开为:

<root><element1><element2></element2></element1></root>

我需要它:

<root>
<element1>
<element2></element2>
</element1>
</root>

这需要在每个结束标签和一个带有子标签的标签之后插入“\n”。

有什么想法吗?

【问题讨论】:

  • 我不确定,但您是否在元素末尾尝试过\n??
  • 听起来好像有人在使用记事本打开您的文件,而不是真正的编辑器。
  • 无论哪种方式都是有效的 XML,您需要对其进行格式化以便于阅读吗?
  • 您可以使用 XMLReader 和 XMLWriter 来解析文件 - 在粒子 XMLWriter 中允许您输出任意文本,而 SimpleXML 不能(afaik)。
  • @Francisc - 不,我认为 OP 有一个遗留处理系统,如果它以这种方式格式化,它只会读取 XML。

标签: php xml


【解决方案1】:

formatOutput 选项可以做到这一点。

【讨论】:

  • 我试过了:$doc = new DOMDocument(); $doc->格式输出=真; $doc->loadXML($data); $doc->save("data/test.xml");但它只是以相同的格式保存,没有返回。
  • 按照建议here加载文件后设置formatOutput。
  • 也试过了,记事本仍然显示为单行。 :(
  • @rsmarsha 记事本是否显示小框而不是换行符?尝试在真正的编辑器中打开文件(例如Notepad++
  • 什么都不显示,例如:"xml version="1.0" encoding="ISO-8859-1"?> LXKCMSSalesOrderRequestCMDBOutSALESORDERREQUEST "
【解决方案2】:

如果它只是为了插入换行符,一个正则表达式就可以了。

但是,不要start parsing XML with Regular Expressions

试试这个:

$xml = preg_replace(
         '=(<(.*?)>)(?![^<>]*</\2>|$)=s', 
         "\\1\n", 
         file_get_contents('php://input') ); 

该表达式匹配所有没有后跟 EOF 的 XML 标记或使用 negative lookahead assertion [(?!..)] 和 backreference 的匹配结束标记。

【讨论】:

  • 正则表达式破解将在CDATA 部分失败。
  • @ceving 你是对的。如果 OP 的字符串中有 CDATA,则此正则表达式可能会在其间插入换行符。 CDATA 的一个例外也可以用于正则表达式。然而,正确的解决方案是使用 XML DOM 解析器,就像 ceving 建议的那样。
猜你喜欢
  • 1970-01-01
  • 2021-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-03
相关资源
最近更新 更多