質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

3583閲覧

要素の属性について

poemt

総合スコア48

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2017/02/24 06:15

編集2017/02/24 07:30

お世話になります。

###前提・実現したいこと
前提:XmlSerializerでXMLを生成したときに要素に属性"xmlns"が付与される。
実現したいこと:要素の属性"xmlns"をはずしたい。

###発生している問題・エラーメッセージ
XmlSerializerでXMLを生成したときに要素に属性"xmlns"が付与されています。
・・・
<Parent1 xmlns="">
<child1>aa</child1>
</Parent1>
<Parent2 xmlns="">
<child2>bb</child2>
</Parent2>
・・・

Parent1,Parent2要素にある属性xmlnsは仕様書にないものなので、生成時に付与されないようにしたい。
###該当のソースコード
(Typeはxsdから生成したクラスです。)

StreamWriter sw = new StreamWriter(Path, false, Encoding.UTF8);
XmlSerializer serializer = new XmlSerializer(typeof(Type));
serializer.Serialize(sw, obj);

###補足情報(言語/FW/ツール等のバージョンなど)
IDEとしてVisualStudio C#を使用しています。
C#、XMLについては浅学のため、不足している情報がありましたらすみません。

追記:
xsdから自動生成したType.csになります。
namespace TEST {
using System.Xml.Serialization;

/// <remarks/> [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727")] [System.SerializableAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="test.jp")] [System.Xml.Serialization.XmlRootAttribute(Namespace="test.jp", IsNullable=false)] public partial class Type { private Parent parentField; /// <remarks/> [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] public Parent1 parent1 { get { return this.parent1Field; } set { this.parent1Field = value; } } } [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727")] [System.SerializableAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(Namespace="test.jp")] public partial class Parent { private string child1Field; /// <remarks/> [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] public string child1 { get { return this.child1Field; } set { this.child1Field = value; } } }

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

haru666

2017/02/24 07:02

すみません、XmlSerializerで普通に出力するだけだと空のXmlnsが出せないのですが、最小構成で再現性のあるコードって提示できますか?
guest

回答2

0

ベストアンサーになっていますが、頂いたコードを確認したので一応…

原因と思われる部分なんですがTypeの各プロパティで以下のアトリビュートが指定されてますよね。

[System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]

FormにXmlSchemaForm.Unqualifiedがついてることによって親の名前空間で装飾する必要がない=名前空間が不要と判断されてtest.jpを外すためにxmlns=""が出力されていたみたいです。

既定の名前空間を空にすると、今度はtest.jp名前空間が名前付きになって、子要素のxlmns属性は外れても親のTypeは修飾子がついた状態になりませんか?

投稿2017/02/24 08:11

haru666

総合スコア1591

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2017/02/24 08:26

私もそこが気になりました。 追記される前に回答を書いたので空の名前空間を指定しましたが、test.jpが指定されていたので解決できたのかな?と
haru666

2017/02/24 08:29

上記のサンプルで単に名前空間を消した状態で結果を出力するとこうなるんですが <?xml version="1.0" encoding="utf-16"?> <q1:Type xmlns:q1="test.jp"> <parent1> <child1>test</child1> </parent1> </q1:Type> Parentのクラスに以下が指定されてるので [System.Xml.Serialization.XmlTypeAttribute(Namespace = "test.jp")] Parentの名前空間はtest.jpにしたいんじゃないか、と思うんですよね
poemt

2017/02/24 09:08

お手数おかけしてすみません。ありがとうございます。 指摘を受けて確認しましたが、確かに"q1"という修飾子がTypeについていました・・・。 ns.Add("test", "test.jp"); として試したところ、Typeの修飾子が <test:Type xlmns="test.jp"> となりました。修飾子については別で仕様があるようなので、確認してみます。 "q1"がどこから出てきたのかも調べてみようと思います。 ありがとうございました。
poemt

2017/02/24 09:10

あ、すみません。ページ更新していなかったので入れ違いになってしまいました。 たびたびありがとうございます。
haru666

2017/02/24 09:29

自動生成されたものから[System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]を消せれば一番だと思いますよ
guest

0

ベストアンサー

C#

1XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 2ns.Add("", ""); 3 4StreamWriter sw = new StreamWriter(Path, false, Encoding.UTF8); 5XmlSerializer serializer = new XmlSerializer(typeof(Type)); 6serializer.Serialize(sw, obj, ns); 7

と空のNameSpaceを指定してみてはどうでしょうか?

投稿2017/02/24 07:41

YAmaGNZ

総合スコア10222

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

poemt

2017/02/24 07:51

解決しました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問