0

&、<、>、"、および'などの不正な文字を含む XML ファイルをよく取得します。そのため、 simple_xmlおよび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>

4

1 に答える 1

0

コメント提供者が言ったように、適切なXMLを送信してもらう必要があります。それができない場合は、次のことを行うことができます。

無効な文字が含まれている可能性のある各要素について、タイプがxs:stringであり、要素名がスキーマ内で一意である場合は、開始タグと終了タグを複数行検索します。これらのタグの間で、に置き換え&&amp;に置き換え、<に置き換え&lt;ます。一重引用符と二重引用符はタグ外のメタ文字ではないため、これらの置換を行うと、有効なXMLが必要になります。送信者が望んでいたXMLではないかもしれませんが、非XMLを有効なXMLに変換するために私が考えることができる唯一の明確な方法です。>&gt;

私が言及した置換の代わりに、これらの文字列要素のテキストコンテンツを常にCDATAセクションでラップすることもできます。しかし、実際には、これらのファイルを生成する人にそれを実行するように要求するのはどれほど難しいですか?

于 2012-07-25T15:25:51.907 に答える