C#を使用して次のxml要素を生成しようとしています。
<Foo xmlns="http://schemas.foo.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://schemas.foo.com
http://schemas.foo.com/Current/xsd/Foo.xsd">
私が抱えている問題は、例外が発生することです。
接頭辞 "を"から同じ開始要素タグ内に再定義することはできません。
これは私のc#コードです:
XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance";
XElement foo = new XElement("Foo", new XAttribute("xmlns", "http://schemas.foo.com"),
new XAttribute(XNamespace.Xmlns + "xsi", "http://www.w3.org/2001/XMLSchema-instance"),
new XAttribute(xsi + "schemaLocation", "http://schemas.foo.com http://schemas.foo.com/Current/xsd/Foo.xsd"));
どうすれば修正できますか?生成されたxmlをSOAPメッセージの本文として送信しようとしています。受信者用にこの形式にする必要があります。
編集:別の質問で自分の答えが見つかりました。 XML名前空間の順序の制御
要素Foo
が名前空間http://schemas.foo.com
の一部であることを示す必要があります。これを試して:
XNamespace xNamespace = "http://schemas.foo.com";
XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance";
XElement foo = new XElement(
xNamespace + "Foo",
new XAttribute("xmlns", "http://schemas.foo.com"),
new XAttribute(XNamespace.Xmlns + "xsi", "http://www.w3.org/2001/XMLSchema-instance"),
new XAttribute(xsi + "schemaLocation", "http://schemas.foo.com http://schemas.foo.com/Current/xsd/Foo.xsd")
);
XDocumentの作成時にこのエラーが発生しました。多くのグーグル検索の後、私はこの記事を見つけました:
たまたま、ドキュメントの途中に説明があったので、幸運にもそれを見つけることができました。
重要な点は、コードでXDocumentがxmlns属性を処理できるようにすることです。 XElementを作成するときの最初の本能は、属性 "xmlns"を追加して値に設定することにより、他のすべてと同様に名前空間属性を設定することです。
代わりに、XNamespace変数を作成し、XElementを定義するときにそのXNamespace変数を使用する必要があります。これにより、XAttributeが要素に効果的に追加されます。
自分でxmlns属性を追加するときは、XElement作成ルーチンに、名前空間なしでXElementを作成してから、予約済みのxmlns属性を使用して名前空間を変更するように指示しています。あなたは自分と矛盾しています。エラーには、「名前空間を空に設定してから、同じタグ内の別の名前空間に再度設定することはできません。数値」と表示されます。
以下の関数はこれを示しています...
private static void Test_Namespace_Error(bool doAnError)
{
XDocument xDoc = new XDocument();
string ns = "http://mynamespace.com";
XElement xEl = null;
if (doAnError)
{
// WRONG: This creates an element with no namespace and then changes the namespace
xEl = new XElement("tagName", new XAttribute("xmlns", ns));
}
else
{
// RIGHT: This creates an element in a namespace, and implicitly adds an xmlns tag
XNamespace xNs = ns;
xEl = new XElement(xNs + "tagName");
}
xDoc.Add(xEl);
Console.WriteLine(xDoc.ToString());
}