web-dev-qa-db-ja.com

C#で、文字列をXMLとしてフォーマットするための最良の方法は何ですか?

C#で軽量エディターを作成しています。文字列を適切にフォーマットされたXML文字列に変換するための最良の方法を知りたいのですが。 C#ライブラリに「public bool FormatAsXml(string text、out stringformatedXmlText)」のようなpublicメソッドがあるといいのですが、それほど簡単ではないでしょうか。

具体的には、以下の出力を生成するメソッド「SomeMethod」は何である必要がありますか?

string unformattedXml;
string formattedXml;

unformattedXml = "<?xml version=\"1.0\"?><book><author>Lewis, C.S.</author><title>The Four Loves</title></book>"
formattedXml = SomeMethod(unformattedXml);

Console.WriteLine(formattedXml);

出力:

<?xml version="1.0"?>
  <book id="123">
    <author>Lewis, C.S.</author>
    <title>The Four Loves</title>
  </book>
40
JohnnyM
string unformattedXml = "<?xml version=\"1.0\"?><book><author>Lewis, C.S.</author><title>The Four Loves</title></book>";
string formattedXml = XElement.Parse(unformattedXml).ToString();
Console.WriteLine(formattedXml);

出力:

<book>
  <author>Lewis, C.S.</author>
  <title>The Four Loves</title>
</book>

XML宣言はToString()では出力されませんが、Save()では出力されます...

  XElement.Parse(unformattedXml).Save(@"C:\doc.xml");
  Console.WriteLine(File.ReadAllText(@"C:\doc.xml"));

出力:

<?xml version="1.0" encoding="utf-8"?>
<book>
  <author>Lewis, C.S.</author>
  <title>The Four Loves</title>
</book>
71
Wonko

残念ながらいいえ、これはFormatXMLForOutputメソッドほど簡単ではありません。これはMicrosoftがここで話していたものです;)

とにかく、.NET 2.0以降では、XmlTextWriterオブジェクトでプロパティを直接設定するのではなく、XMlWriterSettingsClassを使用して書式を設定することをお勧めします。 詳細については、このMSDNページを参照してください 。それは言う:

「.NET Frameworkバージョン2.0リリースでは、XmlWriter.CreateメソッドとXmlWriterSettingsクラスを使用してXmlWriterインスタンスを作成することをお勧めします。これにより、このリリースで導入されたすべての新機能を最大限に活用できます。詳細については、 XMLライターの作成を参照してください。」

推奨されるアプローチの例を次に示します。

XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.IndentChars = ("    ");
using (XmlWriter writer = XmlWriter.Create("books.xml", settings))
{
    // Write XML data.
    writer.WriteStartElement("book");
    writer.WriteElementString("price", "19.95");
    writer.WriteEndElement();
    writer.Flush();
}
15
Ash

新しいSystem.Xml.Linq名前空間(System.Xml.Linqアセンブリ)を使用すると、以下を使用できます。

string theString = "<nodeName>blah</nodeName>";
XDocument doc = XDocument.Parse(theString);

以下を使用してフラグメントを作成することもできます。

string theString = "<nodeName>blah</nodeName>";
XElement element = XElement.Parse(theString);

文字列がまだXMLでない場合は、次のようにすることができます。

string theString = "blah";
//creates <nodeName>blah</nodeName>
XElement element = new XElement(XName.Get("nodeName"), theString); 

この最後の例で注意すべき点は、XElementが提供された文字列をXMLエンコードすることです。

新しいXLINQクラスを強くお勧めします。これらは軽量で、既存のほとんどのXmlDocument関連のタイプよりも使いやすくなっています。

13
Jason Jackson

XMLドキュメントを再フォーマットして新しいノードを新しい行に配置し、インデントを追加するだけであると仮定すると、.NET 3.5以降を使用している場合、最善の解決策は、XDocumentで解析して出力することです。

string unformattedXml;
string formattedXml;

unformattedXml = "<?xml version=\"1.0\"?><book><author>Lewis, C.S.</author><title>The Four Loves</title></book>";
formattedXml = System.Xml.Linq.XDocument.Parse(unformattedXml).ToString();

Console.WriteLine(formattedXml);

ニートフー?

これにより、XMLノードが再フォーマットされます。

フレームワークの以前のバージョンでこれを行うには、空白を再計算する組み込み関数がないため、より多くのレッグワークが必要です。

実際、Linq以前のクラスを使用してそれを行うには、次のようになります。

string unformattedXml;
string formattedXml;

unformattedXml = "<?xml version=\"1.0\"?><book><author>Lewis, C.S.</author><title>The Four Loves</title></book>";
System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
doc.LoadXml(unformattedXml);
System.Text.StringBuilder sb = new System.Text.StringBuilder();
System.Xml.XmlWriter xw = System.Xml.XmlTextWriter.Create(sb, new System.Xml.XmlWriterSettings() { Indent = true });
doc.WriteTo(xw);
xw.Flush();
formattedXml = sb.ToString();
Console.WriteLine(formattedXml);
9
Daniel Bradley

XMLを XmlTextWriter オブジェクトにロードして、FormattingプロパティとIndentationプロパティを設定したいようです。

writer.Formatting = Formatting.Indented;
writer.Indentation = 1;
writer.IndentChar = '\t';
5
defeated

ジェイソンのアプローチは最も簡単です。メソッドは次のとおりです。

private static string FormatXmlString(string xmlString)
{
    System.Xml.Linq.XElement element = System.Xml.Linq.XElement.Parse(xmlString);
    return element.ToString();
}
4
JohnnyM

XML文字をエスケープするだけでよい場合は、次の方法が役立ちます。

string myText = "This & that > <> &lt;";
myText = System.Security.SecurityElement.Escape(myText);
1
sbeskur

Framework 4.0ではisシンプルです。

var unformattedXml = "<?xml version=\"1.0\"?><book><author>Lewis, C.S.</author><title>The Four Loves</title></book>";
var xdoc = System.Xml.Linq.XDocument.Parse(unformattedXml);
var formattedXml = (xdoc.Declaration != null ? xdoc.Declaration + "\r\n" : "") + xdoc.ToString();
Console.WriteLine(formattedXml);

これにより、必要なインデントが追加され、Xml宣言を維持が維持されます。

<?xml version="1.0"?>
<book>
  <author>Lewis, C.S.</author>
  <title>The Four Loves</title>
</book>
1
midspace

文字列は有効なXMLですか? XML文字列をXMLドキュメントに変換するにはどうすればよいですか?もしそうなら、これを行います:

XmlDocument xml = new XmlDocument();

xml.LoadXml( YourString );
0
rp.

System.Xml.Linq.XElement.ToString()が自動的にフォーマットします!

XElement formattedXML = new XElement.Parse(unformattedXmlString);
Console.WriteLine(formattedXML.ToString());
0
radarbob