Подтвердить что ты не робот

Использовать XML-литералы в С#?

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

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

Ответ 1

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

То, что вы разместили, как можно ближе к С#.

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

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

Ответ 2

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

Ответ 3

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

В ретроспективе кажется, что Linq для 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

Ответ 4

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

Ответ 5

Самое близкое, что мы могли бы иметь в С#, было бы через 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);