1

次のようなutf-8でエンコードされたxmlメッセージとしてサーバーからデータを受信します

<?xml version="1.0" encoding="utf-8"?>
<Data namespace="http://example.com/data">
...
</Data>

この例で注目すべき点は、「namespace」修飾子は、実際にはデフォルトの xml 名前空間を指定する「xmlns」修飾子でなければならないということです。シリアライゼーション/デシリアライゼーションのコードは、スキーマ定義ファイルから (自動) 生成されました。xsd とそれに付随するドキュメントの両方が、これがバグであることをほぼ確認しています。

ただし、これは、Data オブジェクトがグローバル/空の名前空間 (xmlns="") に存在するようになり、自動生成されたコードが、逆シリアル化中に XmlSerialzier がスローする典型的な種類の例外で"There is an error in XML document ..."失敗することも意味します。"<Data xmlns=''> was not expected."属性/コードと xml ドキュメントが一致しません。

Namespace自動生成されたコードを変更し、定義を「ホットフィックス」するのはかなり簡単ですが、たとえば

[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
public partial class Data {

私が本当に望んでいるのは名前空間の回復力Namespaceです。つまり、将来のある時点で、データを提供してくれた人によって問題が修正された場合、コード内の定義を再度適用することを余儀なくされたくありません(xmlns の変更前述の例外で逆シリアル化コードが壊れます)。

つまり、上記の欠陥のある xml と、たとえば両方を処理できるコードが必要です。

<?xml version="1.0" encoding="utf-8"?>
<Data xmlns="http://example.com/data">
...
</Data>

または(たとえば、「下位互換性」を維持することを決定した場合)

<?xml version="1.0" encoding="utf-8"?>
<Data xmlns="http://example.com/data" namespace="http://example.com/data">
...
</Data>

どのようなオプションがありますか?

4

1 に答える 1

-1

大きな「XML」が与えられました。逆シリアル化する前に、XML 変換を使用して修正することもできます。

于 2016-06-23T11:40:55.553 に答える