1

xsiスキーマ名前空間に必要な名前空間プレフィックスの宣言が含まれていないため、無効な XML ドキュメントである XML (Web サービス呼び出しから発生 - 以下に提供) があります。

スキーマの名前空間を宣言していませんxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"が、xml 内で同じものを使用しています。

ノードの例は -<messages xsi:nil="true" />などです<value4 xsi:nil="true" />

このため、XML で XSLT 変換を使用できず、アプリがエラーで失敗します

要素タイプ「メッセージ」に関連付けられた属性「xsi:nil」の接頭辞「xsi」はバインドされていません。

すべてのテスト XSLT でも同じエラーが発生しました。を参照しているすべての要素を削除するために、/任意の XSLT を適用する方法はありますxsiか? それらを削除すると、他のユーザーが使用できる有効な XML になります。

Web サービスから返された XML:

<?xml version="1.0" encoding="utf-8"?>
<p849:retrieveAllValues xmlns:p849="http://package.de.bc.a">
    <retrieveAllValues>
        <messages xsi:nil="true" />
        <existingValues>
            <Values>
                <value1> 10.00</value1>
                <value2>123456</value2>
                <value3>1234</value3>
                <value4 xsi:nil="true" />
                <value5 />
            </Values>
        </existingValues>
        <otherValues xsi:nil="true" />
        <recValues xsi:nil="true" />
    </retrieveAllValues>
</p849:retrieveAllValues>
4

2 に答える 2

1

XSLTは、名前空間の整形式XMLで動作するように指定されています。入力は名前空間ではありません-整形式です。つまり、このような入力に直面したときのXSLTプロセッサの動作は仕様の範囲外であり、したがって、これまたはそのXSLTプロセッサを使用して、この不正な形式の入力を処理できる可能性があることも意味します。 XSLTを使用してこれを行うための標準的な方法はありません。

最善の策は、Webサービスの結果が適切に形成されていない理由を突き止めようとすることです(これは本当にWebサービスの障害なのか、それとも一部のソフトウェアがデータを表示する前にデータを変更しているのか)。他のすべてが失敗した場合、一時的な対策として、入力でsedまたは同等のものを使用します。ただし、マイレージは異なる場合があります。

于 2013-02-14T15:11:10.983 に答える
1

不正な形式または無効なXMLがシステムに到着した場合(実際にはXMLではないため通常は非XMLと呼びます)、そのソースまでトレースして、問題をできるだけ近くで修正する必要があります。できる限りソース。ソースで問題を解決できない場合は、できるだけ早く非XMLを修復する必要があります。修復手法は、障害がどの程度体系的であるか、および修復する必要のある障害の性質によって異なります。この場合、データは技術的にはXML形式ですが、名前空間の形式が正しくないため、名前空間に対応しないXMLパーサーを使用して問題を解決できる場合があります。データを名前空間以外のDOMにロードします。 -awareモードで、属性 "xmlns:xsi =" .... "を追加してから、シリアル化します。

ほとんどのXMLツールは整形式のXMLしか処理できないため、非XML入力を処理するには、通常、非XMLツールを使用する必要があります。ただし、このケースは、名前空間を認識しない限り、XMLツールを使用できるケースです。

于 2013-02-14T21:28:53.383 に答える