Предостережение: применимо только в том случае, если ваша цель состоит просто в рендеринге 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 раз внутри секундомера.