web-dev-qa-db-ja.com

C#でXMLリテラルを使用しますか?

C#コードファイル内にリテラルXMLデータを追加することは可能ですか?私は現在複数行の文字列リテラルを使用していますが、ご覧のように乱雑になります。これを行うより良い方法は?

string XML = @"<?xml version=""1.0"" encoding=""utf-8""?>
<customUI xmlns=""http://schemas.example.com/customui"">
    <toolbar id=""save"">
    </toolbar>
</customUI>";
32
Robinicks

XMLリテラル はVB.NETの機能であり、C#ではありません。

あなたが投稿したものは、C#で取得できる限り近いものです。

ただし、埋め込まれた二重引用符を単一引用符に置き換えることを検討することもできます(両方のタイプが有効なXMLであるため)。

XMLの量が多い場合は、Marcからの回答を検討することをお勧めします。XMLファイルを使用して(一度ロードされてメモリに格納される)、XMLエディターを利用できます。

38
Oded

XMLが邪魔になるほど大きい場合は、ディスクからロードするか、リソースとして埋め込むかわりに、フラットな.xmlファイルを使用することを検討してください。 (おそらく静的コンストラクターで)1回だけロードする限り、これはパフォーマンスに影響を与えません。 IDEのXMLファイルエディタを使用するため、保守がかなり簡単になります。そして、それはあなたのコードの邪魔になりません。

17
Marc Gravell

私のコメントを参照すると、これをどこで見たか思い出せませんでしたが、ようやく XmlBuilder link を見つけました。

振り返ってみると、Linq to XMLが最善の策であるようです。 XML文字列を連結するよりもクリーンで、高速で、保守が容易です。

XNamespace ns = "http://schemas.example.com/customui";
XDocument doc = new XDocument(
                    new XDeclaration("1.0", "utf-8", "yes"),
                    new XElement(ns + "customUI",
                        new XElement(ns + "taskbar",
                            new XAttribute("id", "save"))
                    )
                );

var stringWriter = new StringWriter();
doc.Save(stringWriter); //Write to StringWriter, preserving the declaration (<?xml version="1.0" encoding="utf-16" standalone="yes"?>)
var xmlString = stringWriter.ToString(); //Save as string
doc.Save(@"d:\out.xml"); //Save to file
12
Abbas

Razorエンジンを使用してASP.NET環境で作業している場合、CSHTMLファイルで次のことを実行できます。

Func<MyType, HelperResult> xml = @<root>
    <item>@(item.PropertyA)</item>
    <item>@(item.PropertyB)</item>
    <item>@(item.PropertyC)</item>
</root>;

拡張メソッドを追加すると:

public static XDocument ToXDocument<T>(this Func<T, HelperResult> source, T item)
{
    return XDocument.Parse(source(item).ToHtmlString());
}

その後、次のことができます。

XDocument document = xml.ToXDocument(new MyType() {
    PropertyA = "foo",
    PropertyB = "bar",
    PropertyC = "qux",
});

繰り返しますが、特異ですか? はい。ケース固有? はい。しかし、それは機能し、素晴らしいIntellisenseを提供します。 (ドキュメントの検証バージョンによっては、一連の有効性の警告も表示されます

5
Dan Lugg

C#で最も近いのは、LINQを介したものです。

var xml = XDocument.Load(
    new StringReader(@"<Books>
    <Book author='Dan Brown'>The Da Vinci Code</Book>
    <Book author='Dan Brown'>The Lost Symbol</Book>
    </Books>"));

var query = from book in xml.Elements("Books").Elements("Book")
    where book.Attribute("author").Value == "Dan Brown"
    select book.Value;

foreach (var item in query) Console.WriteLine(item);
0