php - 使用 simplexml_load_string() 解析 XML
问题描述
我有以下来自我必须使用的 API 的 xml 数据集:
<?xml version="1.0" encoding="utf-8"?>
<DataSet xmlns="http://examplesite.com/WebRes">
<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="BuildingInfo">
<xs:complexType>
<xs:sequence>
<xs:element name="ID_Building" type="xs:int" minOccurs="0" />
<xs:element name="Name" type="xs:string" minOccurs="0" />
<xs:element name="Description" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
<NewDataSet xmlns="">
<BuildingInfo diffgr:id="BuildingInfo1" msdata:rowOrder="0">
<ID_Building>333</ID_Building>
<Name>Example Building Name</Name>
<Description />
</BuildingInfo>
</NewDataSet>
<NewDataSet xmlns="">
<BuildingInfo diffgr:id="BuildingInfo1" msdata:rowOrder="0">
<ID_Building>334</ID_Building>
<Name>Example Building Name2</Name>
<Description />
</BuildingInfo>
</NewDataSet>
</diffgr:diffgram>
</DataSet>
这个问题是,如果我执行以下操作:
<?php $result = simplexml_load_string( $xml, 'SimpleXMLElement', 0, 'xs' );
echo ($result ? 'Valid XML' : 'Parse Error'), PHP_EOL;
print_r( $result );
结果是:
Parse Error
SimpleXMLElement Object
(
)
作为后备解决方案,我使用了:
$p = xml_parser_create();
xml_parse_into_struct( $p, $xml, $result, $index );
xml_parser_free( $p );
哪个工作得很好。
另一个问题是,从同一个 API 我也有这样的响应:
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfRoomTypeBuildingsDetails xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://examplesite.com/WebRes">
<RoomTypeBuildingsDetails>
<ID_RoomType>123</ID_RoomType>
<RoomTypeName>Post Name</RoomTypeName>
<RoomTypeDescription>This is the description</RoomTypeDescription>
<GuestMax>2</GuestMax>
</RoomTypeBuildingsDetails>
</ArrayOfRoomTypeBuildingsDetails>
与该功能完美配合simplexml_load_string()
。这意味着我将 XML Parser 用于一些响应和simplexml_load_string()
其他不太容易维护的响应。
这里的问题是:有没有办法使用 解析这两种响应类型simplexml_load_string()
?还是我应该切换到 XML Parser 或 DOMDocument 或其他类似的库?
注意:从第一个 XML 片段中,我只对从NewDataSet
节点中提取内容感兴趣。
如果您需要更多详细信息,请告诉我。任何帮助表示赞赏。
解决方案
仔细检查解析错误。空的 SimpleXMLElement 可能解析为false
,如果您的 XML 不包含文本或仅包含命名空间元素,则您的错误检查可能是错误的。=== false
检查解析错误时始终使用。
改用这个:
echo ($result !== false ? 'Valid XML' : 'Parse Error'), PHP_EOL;
推荐阅读
- python - 虚拟环境中的 Python site.getsitepackages() 显示两条路径,我可以删除非虚拟环境之一吗?
- pdftron - 如何在 Pdftron 的画布上访问文本层
- reactjs - 电子中的 Antd Datepicker - 无法读取 null 的属性“年份”
- redis - Redis命令行如何订阅“+odown”、“+sdown”、“+switch-master”?
- git-bash - Gradlew 使用 Git Bash 打印控制字符
- amazon-web-services - AWS Application Load Balancer 是否处理反向代理?
- javascript - 如何增加 DOM(oneliner)?
- css - 如何使 CSS 库中的 div 保持一致,或全部保持相同大小或两者兼而有之?
- sql - 如何在 Postgres 的 Json 类型列中添加键值对
- awesome-wm - 获取下一个和上一个标签 (AwesomeWM)