验证&,<,>,“,'标志

时间:2012-07-25 15:04:13

标签: php xml dom xsd simplexml

我经常会收到包含非法字符的XML文件,例如&amp;,&lt;,&gt;,“'。因此,我无法用< strong> simple_xml &amp; DOM 并根据我的 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>

1 个答案:

答案 0 :(得分:0)

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

对于可能包含无效字符的每个元素,如果类型为xs:string且元素名称在模式中是唯一的,请对open和close标记执行多行搜索。在这些代码之间,将&替换为&amp;,将<替换为&lt;,并将>替换为&gt;。单引号和双引号不是标记之外的元字符,因此一旦进行了这些替换,就应该使用有效的XML。它可能不是发送者想要的XML,但它是我能想到的将非XML转换为有效XML的唯一明确方式。

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