PHP SimpleXML 对象中的属性消失了?
我需要返回一个转换为 JSON 对象的 SimpleXML 对象,以便在 JavaScript 中使用它。问题是任何对象上都没有具有值的属性。
举个例子:
<customer editable="true" maxChars="9" valueType="numeric">69236</customer>
在 SimpleXML 对象中变成:
"customer":"69236"
@attributes
对象在哪里?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
这多次让我发疯。当 SimpleXML 遇到只有文本值的节点时,它会删除所有属性。我的解决方法是在使用 SimpleXML 解析之前修改 XML。使用一些正则表达式,您可以创建一个包含实际文本值的子节点。例如,在您的情况下,您可以将 XML 更改为:
假设您的 XML 字符串位于 $str 中的一些示例代码:
这将保留属性并将文本值嵌套在子节点中。
This has driven me crazy on several occasions. When SimpleXML encounters a node that only has a text value, it drops all the attributes. My workaround has been to modify the XML prior to parsing with SimpleXML. With a bit of regular expressions, you can create a child node that contains the actual text value. For example, in your situation you can change the XML to:
Some example code assuming that your XML string was in $str:
That would preserve the attributes and nest the text value in a child node.
我意识到这是一篇旧文章,但以防万一它有用。下面扩展了 @ryanmcdonnell 的解决方案,使其适用于任何标签而不是硬编码标签。希望它能帮助某人。
主要区别在于它将
/ 替换为
/<([^ ]+)
,然后是与
告诉它将搜索的该部分与模式中的第一个元素进行匹配。
然后它只是调整占位符 (
$1
,$2
,$3
) 以考虑现在有三个子匹配而不是两个的事实。I realize this is an old post, but in case it proves useful. The below extends @ryanmcdonnell's solution to work on any tags instead of a hard-coded tag. Hopefully it helps someone.
The main different is that it replaces
/<customer
with/<([^ ]+)
, and then</customer>
with</\\1>
which tells it to match that part of the search against the first element in the pattern.
Then it just adjusts the placeholders (
$1
,$2
,$3
) to account for the fact that there are three sub-matches now instead of two.所以看来这是一个 bug 并在 PHP 7.4.5 中修复。
So it appears that this is a bug and is fixed in PHP 7.4.5.
这是一个老问题,但我发现了一些有用的东西 - 将其解析为 DOMNode 对象。
将显示:
It's an old question, but I found something that works neat - parse it into a DOMNode object.
Will show:
下面是一些用于迭代属性并构造 JSON 的代码。如果支持,一个或多个客户。
如果您的 XML 看起来像这样(或只是一个客户),
请像这样迭代它。
生成这样的 JSON 结构
最后,在您的脚本中,访问这样的属性
祝你好运
Here's some code to iterate through attributes, and construct JSON. If supports, one or many customers.
If you're XML looks like this (or just one customer)
Iterate through it like this.
To produce a JSON structure like this
Finally, in your script, access the attribute like this
Good luck