php5 simple_xml_file 解析错误

发布于 2024-08-19 07:16:06 字数 1959 浏览 4 评论 0原文

我尝试在第一个实例中使用 php 函数 simplexml_load_file 传递下面的 XML 代码。目前,php 代码非常简单,如下所示:

if (file_exists('test.xml')) {
    $xml = simplexml_load_file('test.xml');

    print_r($xml);
} else {
    exit('Failed to open test.xml.');
}

但是,在运行此文件时,它首先会给出一个解析错误,说明 URI PostcodeAnywhere 不是绝对的。最终脚本抛出错误“字符串无法解析为 XML”。

XML 文件本身似乎是有效的并且没有显示任何错误。

<?xml version="1.0" encoding="utf-8"?>
<DataSet xmlns="PostcodeAnywhere">
  <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="Table1">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="Id" type="xs:string" minOccurs="0" />
                <xs:element name="Name" type="xs:string" minOccurs="0" />
                <xs:element name="Items" type="xs:string" minOccurs="0" />
                <xs:element name="BillingModel" 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="">
      <Table1 diffgr:id="Table11" msdata:rowOrder="0" diffgr:hasChanges="inserted">
        <Id>3898</Id>
        <Name>DIA Members</Name>
        <Items />
        <BillingModel>PREPAID</BillingModel>
      </Table1>
    </NewDataSet>
  </diffgr:diffgram>
</DataSet>

I am trying to pass the XML code below, in the first instance using the php function simplexml_load_file. Currently the php code is incredibly simple as follows:

if (file_exists('test.xml')) {
    $xml = simplexml_load_file('test.xml');

    print_r($xml);
} else {
    exit('Failed to open test.xml.');
}

However on running this file it firstly gives a parse error that the URI PostcodeAnywhere is not absolute. Ultimately the script throws the error 'String could not be parsed as XML'.

The XML file itself seems to validate and doesn't show any errors.

<?xml version="1.0" encoding="utf-8"?>
<DataSet xmlns="PostcodeAnywhere">
  <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="Table1">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="Id" type="xs:string" minOccurs="0" />
                <xs:element name="Name" type="xs:string" minOccurs="0" />
                <xs:element name="Items" type="xs:string" minOccurs="0" />
                <xs:element name="BillingModel" 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="">
      <Table1 diffgr:id="Table11" msdata:rowOrder="0" diffgr:hasChanges="inserted">
        <Id>3898</Id>
        <Name>DIA Members</Name>
        <Items />
        <BillingModel>PREPAID</BillingModel>
      </Table1>
    </NewDataSet>
  </diffgr:diffgram>
</DataSet>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

月下凄凉 2024-08-26 07:16:06

SimpleXML 因无效的名称空间声明而窒息。您控制源 XML 吗?如果是这样,您可以删除命名空间或修复它以使用 URN。否则,libxml 中可能有一个选项可以忽略错误的名称空间?

<!-- no namespace -->
<DataSet>

<!-- URN -->
<DataSet xmlns="urn:PostcodeAnywhere">

编辑:让我修改一下,SimpleXML 并没有令人窒息,它只是大声清了清喉咙。您会收到一堆警告,但仅此而已,创建了一个 SimpleXMLElement,并且从我所看到的来看似乎可以正常工作。如果您无法修复源 XML 并且警告困扰您,您可以在加载期间关闭错误报告,如下所示:

libxml_use_internal_errors(false);
$xml = simplexml_load_file('test.xml');
libxml_use_internal_errors(false);

SimpleXML is choking on that invalid namespace declaration. Do you control the source XML? If so, you can remove the namespace or fix it to use a URN. Otherwise, there might be an option in libxml to ignore bad namespaces?

<!-- no namespace -->
<DataSet>

<!-- URN -->
<DataSet xmlns="urn:PostcodeAnywhere">

Edit: let me amend that, SimpleXML isn't choking, it's merely clearing its throat loudly. You get a bunch of Warnings but that's all, a SimpleXMLElement is created and seems to work from what I could see. If you can't fix the source XML and the warnings bother you, you can just turn off the error reporting during loading, like so:

libxml_use_internal_errors(false);
$xml = simplexml_load_file('test.xml');
libxml_use_internal_errors(false);
私藏温柔 2024-08-26 07:16:06

我不知道,您的 XML 看起来不错(不过,也许您需要删除 声明。)作为一般规则,XML 解析器本身非常详细地告诉您什么是错误的。

要获取解析器的错误,您可以

I don't know, your XML looks fine (maybe you need to remove the <? ?> declaration, though.) As a general rule, the XML parser itself is very detailed in telling what's wrong.

To get the parser's errors, you can either

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文