0

我经常得到具有非法字符的 XML 文件,例如&、<、>、"'。因此,我无法使用simple_xmlDOM读取它们,也无法根据下面的XSD验证用户的XML文件以在 PHP 中进行进一步处理。

有没有办法解决这个问题?

我正在从远程主机读取 XML 文件,因此它可以在 10KB 和 10MB 之间。

提前致谢

注意:我只在下面放了无效的 XML 元素,因为某些原因整个 XML 文件在这里显示为纯文本。

XML

<url>http://www.amazon.co.uk/gp/product/B005MG8O96/ref=olp_product_details?ie=UTF8&me=&seller=</url>
<description>iPhone 4. The "fastest", <b>highest-resolution</b> iPhone.</description>

XSD

<?xml version="1.0" encoding="UTF-8"?>

<xs:element name="store">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="item" minOccurs="1" maxOccurs="unbounded">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="title" type="title_type" />
                        <xs:element name="description" type="description_type" />
                        <xs:element name="price" type="xs:decimal" />
                        <xs:element name="url" type="url_type" />
                        <xs:element name="images">
                            <xs:complexType>
                                <xs:sequence>
                                    <xs:element name="image" minOccurs="1" maxOccurs="unbounded">
                                        <xs:complexType>
                                            <xs:attribute name="url" type="url_type" />
                                        </xs:complexType>
                                    </xs:element>
                                </xs:sequence>
                            </xs:complexType>
                        </xs:element>
                    </xs:sequence>
                    <xs:attribute name="id" type="id_type" />
                    <xs:attribute name="available" type="available_type" />
                </xs:complexType>
            </xs:element>
        </xs:sequence>
        <xs:attribute name="id" type="id_type" />
        <xs:attribute name="date" type="xs:date" />
        <xs:attribute name="time" type="xs:time" />
    </xs:complexType>
</xs:element>

<xs:simpleType name="title_type">
    <xs:restriction base="xs:string">
        <xs:minLength value="1" />
        <xs:maxLength value="100" />
    </xs:restriction>
</xs:simpleType>

<xs:simpleType name="description_type">
    <xs:restriction base="xs:string">
        <xs:minLength value="1" />
        <xs:maxLength value="255" />
    </xs:restriction>
</xs:simpleType>

<xs:simpleType name="url_type">
    <xs:restriction base="xs:anyURI">
        <xs:minLength value="10" />
        <xs:maxLength value="2000" />
    </xs:restriction>
</xs:simpleType>

<xs:simpleType name="id_type">
    <xs:restriction base="xs:string">
        <xs:minLength value="1" />
        <xs:maxLength value="100" />
    </xs:restriction>
</xs:simpleType>

<xs:simpleType name="available_type">
    <xs:restriction base="xs:string">
        <xs:enumeration value="Yes" />
        <xs:enumeration value="No" />
    </xs:restriction>
</xs:simpleType>

4

1 回答 1

0

正如评论者所说,您应该让他们向您发送正确的 XML。如果您无法做到,您可以执行以下操作:

对于每个可能包含无效字符的元素,如果类型是 xs:string 并且元素名称在您的架构中是唯一的,则对打开和关闭标签进行多行搜索。在这些标签之间,替换&&amp;、替换<&lt;和替换>&gt;。单引号和双引号不是标签之外的元字符,因此一旦您进行了这些替换,您应该拥有有效的 XML。它可能不是发件人想要的 XML,但这是我能想到的将他们的非 XML 转换为有效 XML 的唯一明确方式。

我提到的替代方法的替代方法是始终将这些字符串元素的文本内容包装在 CDATA 部分中。但实际上,只要求生成这些文件的人为您执行此操作有多难?

于 2012-07-25T15:25:51.907 回答