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>
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>
残念ながらいいえ、これは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();
}
新しい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関連のタイプよりも使いやすくなっています。
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);
XMLを XmlTextWriter オブジェクトにロードして、FormattingプロパティとIndentationプロパティを設定したいようです。
writer.Formatting = Formatting.Indented;
writer.Indentation = 1;
writer.IndentChar = '\t';
ジェイソンのアプローチは最も簡単です。メソッドは次のとおりです。
private static string FormatXmlString(string xmlString)
{
System.Xml.Linq.XElement element = System.Xml.Linq.XElement.Parse(xmlString);
return element.ToString();
}
XML文字をエスケープするだけでよい場合は、次の方法が役立ちます。
string myText = "This & that > <> <";
myText = System.Security.SecurityElement.Escape(myText);
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>
文字列は有効なXMLですか? XML文字列をXMLドキュメントに変換するにはどうすればよいですか?もしそうなら、これを行います:
XmlDocument xml = new XmlDocument();
xml.LoadXml( YourString );
System.Xml.Linq.XElement.ToString()が自動的にフォーマットします!
XElement formattedXML = new XElement.Parse(unformattedXmlString);
Console.WriteLine(formattedXML.ToString());