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

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

ただいまの
回答率

90.50%

  • C#

    7121questions

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

  • XML

    653questions

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

要素の属性について

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 701

poemt

score 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;
}
}
}
}

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • haru666

    2017/02/24 16:02

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

    キャンセル

回答 2

checkベストアンサー

0

XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/24 16:51

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

    キャンセル

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 17:26

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

    キャンセル

  • 2017/02/24 17: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にしたいんじゃないか、と思うんですよね

    キャンセル

  • 2017/02/24 18:08

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

    キャンセル

  • 2017/02/24 18:10

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

    キャンセル

  • 2017/02/24 18:29

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

    キャンセル

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

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    7121questions

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

  • XML

    653questions

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