Использовать литералы XML в C #? - PullRequest
32 голосов
/ 07 января 2012

Можно ли добавить буквальные данные XML в файл кода C #?В настоящее время я использую многострочный строковый литерал, но, как вы видите, он становится грязным.Есть ли лучший способ сделать это?

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

Ответы [ 5 ]

38 голосов
/ 07 января 2012

XML-литералы - это функция VB.NET, а не C #.

То, что вы опубликовали, настолько близко, насколько вы можете получить в C #.

Вы можете рассмотреть возможность замены встроенных двойных кавычек на одинарные (поскольку оба типа являются допустимыми XML).

Для больших объемов XML вы можете рассмотреть ответ от Марка -используя файл XML (загруженный один раз и сохраненный в памяти), чтобы вы могли воспользоваться редактором XML.

17 голосов
/ 07 января 2012

Если XML достаточно большой, чтобы мешать, подумайте об использовании плоского XML-файла вместо этого, либо загруженного с диска, либо встроенного в качестве ресурса.Пока вы загружаете его только один раз (возможно, в статическом конструкторе), это не повлияет на производительность.Его будет значительно проще поддерживать, поскольку он будет использовать редактор XML-файлов IDE.И это не помешает вашему коду.

12 голосов
/ 07 января 2012

Со ссылкой на мой комментарий я не могу вспомнить, где я это увидел, но я наконец-то нашел ссылку XmlBuilder .

Оглядываясь назад, кажется, 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
5 голосов
/ 31 мая 2013

Как своеобразное и очень индивидуальное решение, если вы работаете в среде ASP.NET с использованием движка Razor, в файле 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",
});

Опять, своеобразно? Да . Case-конкретнее? Да . Но это работает, и дает отличный Intellisense. ( обратите внимание, он также выдаст кучу предупреждений о валидности, в зависимости от версии валидации документа )

0 голосов
/ 17 ноября 2013

Ближе всего мы могли бы иметь в C # через LINQ, что-то вроде этого:

...