実際に定義されている "定義されていない"名前空間接頭辞を使用してXMLを逆シリアル化するのに問題があります。"名前空間接頭辞が定義されていません"実際に定義されています
さまざまなクライアントに対応する内部WebサービスをC#で公開しました。新しいクライアントのIDEは、XML出力のすべての要素に対してxsi:typeを宣言し、この「機能」をオフにすることはできません。
彼らが作り出すXMLメッセージは、このようになります。ここで、「名前空間」は正しい名前空間です。
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<myOperation xsi:type="ns1:namespace" xmlns="namespace" xmlns:ns1="namespace">
<inputString xsi:type="xsd:string">ABCDEF</inputString>
<books xsi:type="ns1:booksType">
<bookID xsi:type="xsd:string">ABC123</bookID>
<bookID xsi:type="xsd:string">DEF456</bookID>
</books>
<!-- ... snip... -->
</myOperation>
</soapenv:Body>
<books>
は基本的に文字列の配列です。
サービスメソッドはXmlNodeとして受け入れますが、XmlSerializerは "prefix 'ns1' not defined"エラーをスローします。 (それは親ノードで定義されていますが、それは十分ではないようです。)wsdl.exeを使用してクラスを生成し、入力を逆シリアル化する同様の問題があります。
XmlNamespaceManagerを使用してプレフィックスを指定すると、マジックナンバーに似ていないようですが、特定のコンシューマがどのプレフィックスを宣言するかは予測できません。属性を取り除かずにこれを処理する方法はありますか(books.Attributes.RemoveAll)?特にエレガントな感じはしません。
books.OuterXMLには、その接頭辞()を使用するためにインバウンドの要素をハックしないと 'なぜns1'の情報が含まれていないのか分かりませんが、 'ns1'は上記の前の定義から認識されません。
誰かが助けることができる、または少なくとも教育に感謝します。
編集:<books>
にプレフィックス()を使用するように変更しても問題ありません。これは、xmlnsまたはnoを定義したかどうかに関係なく動作します。これはthis answerと一貫しているかもしれませんが、サービスコードの接頭辞をどうやって宣言するかはまだ分かりません。
@クリス、確かに。私は、「閉鎖された源を持つ刺青」と「助ける者に役立つ」とのバランスをとることができると願っています。ここで "books"は、serviceメソッドのパラメータで受け取ったXmlNodeです。 (トピックを下車しないようにするだけでなく、謙虚に、一般的には、それを改善するための提案を取るでしょう。私はまだ初心者です。)
XmlSerializer xmlSerializer = new XmlSerializer(typeof(booksType));
StringReader xmlDataReader = new StringReader(books.OuterXml);
books = (booksType)xmlSerializer.Deserialize(xmlDataReader);
クラスはかなりこのです:
[Serializable()]
[XmlRoot("books", Namespace = "namespace")]
[XmlTypeAttribute(TypeName = "booksType", Namespace = "namespace")]
public class booksType
{
[XmlElement(ElementName = "bookID")]
public string[] bookIDs { get; set; }
}
一部のDOM実装では、同じ名前空間URIが2回バインドされているとは見なされません。 xmlns = "namespace"を削除してもそれでも文句はありますか? – biziclop
@biziclop - これは興味深い提案です。私が以前見たことのない問題です。どのDOM実装を見たことがありますか? –