Есть ли XElement, эквивалентный XmlWriter.WriteRaw? - PullRequest
3 голосов
/ 20 апреля 2011

Я конвертирую некоторый код, который в настоящее время использует XmlWriter для создания документа, чтобы вместо этого вернуть XElement содержимого.

Пока что мне нравится структурировать код таким образом, который имитирует структуру документа, но есть контент, который был написан с использованием XmlWriter.WriteRaw, чтобы избежать повторной XML-XML. Я не могу найти эквивалент в пространстве имен System.Xml.Linq. Один существует?

Ответы [ 2 ]

3 голосов
/ 20 апреля 2011

XElement.Parse() должны сделать трюк.

Например:

XElement e = new XElement("root",
    new XElement("child",
        XElement.Parse("<big><blob><of><xml></xml></of></blob></big>"),
        new XElement("moreXml")));
2 голосов
/ 13 января 2014

Предостережение: применимо только в том случае, если ваша цель состоит просто в рендеринге XML-строки, и вы уверены, что содержимое уже является XML

, так как XElement.Parse "re-xmlizes"уже существующий XML, вы можете установить для содержимого значение 'placeholder' (как предложено здесь ) и заменить его в отображаемом выводе:

var d = new XElement(root, XML_PLACEHOLDER);
var s = d.ToString().Replace(XML_PLACEHOLDER, child);

Обратите внимание, что это не гарантирует«красивое форматирование», если child его уже нет.

Проверка этого в LinqPad, похоже, указывает на то, что «Замена» быстрее, чем использование Parse:

void Main()
{
    // testing:
    // * /970600/kak-dobavit-suschestvuyschuy-stroku-xml-v-xelement
    // * https://stackoverflow.com/questions/16586443/adding-xml-string-to-xelement
    // * https://stackoverflow.com/questions/587547/how-to-put-in-text-when-using-xelement
    // * https://stackoverflow.com/questions/5723146/is-there-an-xelement-equivalent-to-xmlwriter-writeraw

    var root = "root";
    var childContents = "<name>Fname</name><age>23</age><sex>None of your business</sex>";
    var child = "<child>" + childContents + "</child>";

    parse(root, child, true);
    replace(root, child, true);

// this fails, per https://stackoverflow.com/questions/16586443/adding-xml-string-to-xelement
try {
        parse(root, childContents, true);
    } catch(Exception ex) {
        ex.Dump();
    }
// this works, but again, you don't get the pretty formatting
    try {
        replace(root, childContents, true);
    } catch(Exception ex) {
        ex.Dump();
    }

    "Xml Parsing".Vs(new [] { "parse", "replace" }
        , n => parse(root, child, false)
        , n => replace(root, child, false)
    );
}

// Define other methods and classes here
void parse(string root, string child, bool print) {
    var d = new XElement(root, XElement.Parse(child));
    var s = d.ToString();
    if(print) s.Dump("Parse Result");
}

const string XML_PLACEHOLDER = "##c##";
void replace(string root, string child, bool print) {
    var d = new XElement(root, XML_PLACEHOLDER);
    var s = d.ToString().Replace(XML_PLACEHOLDER, child);
    if(print) s.Dump("Replace Result");
}

, где Vs является функцией-оболочкой для запуска каждого делегата 10000 раз внутри секундомера.

...