在C#中使用XML Literals?

时间:2012-01-07 09:47:37

标签: c# xml literals

是否可以在C#代码文件中添加文字XML数据?我目前正在使用多行字符串文字,但你可以看到它变得混乱。有没有更好的方法呢?

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

5 个答案:

答案 0 :(得分:38)

XML literals是VB.NET的一个特性,而不是C#。

你发布的内容尽可能接近C#。

您可能需要考虑用单引号替换嵌入式双引号(因为两种类型都是有效的XML)。

对于大量的XML,您可能需要考虑Marc的答案 - 使用XML文件(加载一次并存储在内存中),这样您就可以利用XML编辑器。

答案 1 :(得分:17)

如果XML足够大,可以考虑使用平面.xml文件,或者从磁盘加载,或者作为资源嵌入。只要你只加载一次(可能在静态构造函数中),这对性能没有任何影响。它将更容易维护,因为它将使用IDE的XML文件编辑器。它不会妨碍你的代码。

答案 2 :(得分:12)

参考我的评论,我不记得我在哪里看到这个,但我终于找到了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

答案 3 :(得分:5)

作为一种特殊的,特定于案例的解决方案,如果你碰巧使用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",
});

再次,奇特? 的。案件的具体情况? 的。但它有效,并提供了很好的智能感知。 (请注意,它还会提供一堆有效性警告,具体取决于文档验证版本

答案 4 :(得分:0)

我们在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);