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

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

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

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

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

1回答

251閲覧

C#でxmlファイル出力時、自己終了タグをスペースなしで出力がしたい。

nopio777

総合スコア2

XML

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

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2024/10/18 07:37

編集2024/10/18 07:43

実現したいこと

C#でxmlファイル出力時、自己終了タグをスペース無しで出力したいです。
インデントはありの設定のままでできる方法を教えてください。

以下のようなxmlファイルを出力がしたいです。

<?xml version="1.0" encoding="Shift_JIS"?>

 <Styudent>
<English></English>
<Math></Math>
<No/>
</Styudent>

発生している問題・分からないこと

こちらが出力結果なのですが、Noタグのタグ名とスラッシュの間にスペースが入ってしまいます。

<?xml version="1.0" encoding="Shift_JIS"?> <Styudent> <English></English> <Math></Math> <No /> </Styudent>

該当のソースコード

C#

1using (var writer = XmlWriter.Create(xml_full_nm, new XmlWriterSettings() { Indent = true, Encoding = Encoding.GetEncoding("Shift-JIS") })) 2 { 3 writer.WriteProcessingInstruction("xml", "version=\"1.0\" encoding=\"Shift_JIS\""); 4 5 writer.WriteStartElement("Styudent"); 6 this.SetElement(writer, "English", ""); 7 this.SetElement(writer, "Math", ""); 8 9 writer.WriteStartElement("No"); 10 writer.WriteEndElement(); 11 writer.WriteEndElement(); 12 } 13 14 private void SetElement(XmlWriter writer, string tagNm, string value) 15 { 16 17 writer.WriteStartElement(tagNm); 18 writer.WriteValue(value); 19 writer.WriteRaw(SecurityElement.Escape(value)); 20 writer.WriteEndElement(); 21 22 }

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

XmlWriterで標準的に出力される終了タグには空白が含まれる場合があることはわかりました。

補足

特になし

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

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

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

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

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

TN8001

2024/10/18 09:23

XmlWriterでひとつずつ書いてるならインデントレベルもわかるはずなので、WriteRawで直接書いちゃえばいいのでは?(そういう話ではない??
guest

回答1

0

ベストアンサー

XmlWriter の内部実装を見る限り

XmlTextWriter.WriteEndStartTag() は次の様な実装となっています。

csharp

1private void WriteEndStartTag(bool empty) 2{ 3 _xmlEncoder.StartAttribute(false); 4 for (int i = _nsTop; i > _stack[_top].prevNsTop; i--) 5 { 6 if (!_nsStack[i].declared) 7 { 8 _textWriter.Write(" xmlns:"); 9 _textWriter.Write(_nsStack[i].prefix); 10 _textWriter.Write('='); 11 _textWriter.Write(_quoteChar); 12 _xmlEncoder.Write(_nsStack[i].ns); 13 _textWriter.Write(_quoteChar); 14 } 15 } 16 // Default 17 if ((_stack[_top].defaultNs != _stack[_top - 1].defaultNs) && 18 (_stack[_top].defaultNsState == NamespaceState.DeclaredButNotWrittenOut)) 19 { 20 _textWriter.Write(" xmlns="); 21 _textWriter.Write(_quoteChar); 22 _xmlEncoder.Write(_stack[_top].defaultNs); 23 _textWriter.Write(_quoteChar); 24 _stack[_top].defaultNsState = NamespaceState.DeclaredAndWrittenOut; 25 } 26 _xmlEncoder.EndAttribute(); 27 if (empty) 28 { 29 _textWriter.Write(s_closeTagEnd); 30 } 31 else 32 { 33 _textWriter.Write('>'); 34 } 35}

https://github.com/dotnet/runtime/blob/be013ed306ea178907baca6763601f9b2e69a400/src/libraries/System.Private.Xml/src/System/Xml/Core/XmlTextWriter.cs#L1384C22-L1418

ソース上の s_closeTagEnd はつまり

csharp

1private static readonly char[] s_closeTagEnd = new char[] { ' ', '/', '>' };

https://github.com/dotnet/runtime/blob/be013ed306ea178907baca6763601f9b2e69a400/src/libraries/System.Private.Xml/src/System/Xml/Core/XmlTextWriter.cs#L1382C9-L1382C85

となっている為、どうにもする方法は無いですね。

stackoverflow だと xmlString.Replace(" />", "/>"); でどうにかしている様ではありましたがそういう設定は無さそうとのことです。
https://stackoverflow.com/questions/6600902/remove-whitespace-in-self-closing-tags-when-writing-xml-document

playground

投稿2024/10/18 08:34

編集2024/10/18 08:36
juner

総合スコア453

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

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

nopio777

2024/10/18 09:02

ご回答ありがとうございます。 どうすることもできないのですね・・・ StringWriterで書き込むことにします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問