Wie kann ich diesen String-to-XML-Code ändern, um LINQ-to-XML?
-
06-07-2019 - |
Frage
In meiner Anwendung ich eine XML-Datei mit diesem Code erstellen mit String :
StringBuilder sb = new StringBuilder();
sb.Append("<?xml version=\"1.0\" encoding=\"utf-8\"?>" + Environment.NewLine);
sb.Append(String.Format("<{0}>{1}", _pluralCamelNotation, Environment.NewLine));
for (int index = 0; index < 3; index++)
{
sb.Append(String.Format("\t<{0}>{1}", _singularCamelNotation, Environment.NewLine));
foreach (DataType dataType in _allDataTypes)
{
sb.Append(String.Format("\t\t<{0}>{2}</{0}>{1}", dataType.CamelCaseNotation, Environment.NewLine, dataType.GetDummyData()));
}
sb.Append(String.Format("\t</{0}>{1}", _singularCamelNotation, Environment.NewLine));
}
sb.Append(String.Format("</{0}>{1}", _pluralCamelNotation, Environment.NewLine));
return sb.ToString();
Wie kann ich das gleiche tun mit LINQ , so etwas wie folgt aus:
PSEUDO-CODE:
var xdoc = new XDocument(
new XDeclaration("1.0", "utf-8", null),
for (int index = 0; index < 3; index++) {
new XElement(_pluralCamelNotation,
_allDataTypes.Select(datatype => new XElement(_singularCamelNotation,
new XElement(datatype.CamelCaseNotation, datatype.GetDummyData())
))
)
}
);
Lösung
Auch ohne LINQ, sollten Sie nicht xml über Verkettung schreiben ... XmlWriter
gut passen würde:
XmlWriterSettings settings = new XmlWriterSettings();
settings.NewLineHandling = NewLineHandling.Entitize;
settings.Indent = true;
settings.IndentChars = "\t";
StringBuilder sb = new StringBuilder();
using (XmlWriter xw = XmlWriter.Create(sb, settings))
{
xw.WriteStartDocument();
xw.WriteStartElement(_pluralCamelNotation);
for (int i = 0; i < 3; i++)
{
xw.WriteStartElement(_singularCamelNotation);
foreach (DataType dataType in _allDataTypes)
{
xw.WriteElementString(dataType.ToString(),
dataType.GetDummyData());
}
xw.WriteEndElement();
}
xw.WriteEndElement();
xw.WriteEndDocument();
xw.Close();
}
Sie können XmlWriterSettings
verwenden, um Dinge zu steuern, wie Zeilenabstand.
Alternativ mit LINQ-to-XML:
XDocument doc = new XDocument(
new XDeclaration("1.0", null, null),
new XElement(_pluralCamelNotation,
Enumerable.Range(1,3).Select(
i => new XElement(_singularCamelNotation,
_allDataTypes.Select(
dataType => new XElement(
dataType.ToString(),
dataType.GetDummyData())
)
))));
string t = doc.ToString();
Andere Tipps
Dies ist ein Bereich, dass VB.Net über C # gewinnt damit von XML-Literale verwenden. Schauen Sie sich diesen Code genommen von http://blogs.msdn.com/jimoneil/archive/2009/06/15/x-is-for-xml-literal.aspx . Ist das nicht schön?
Dim xml = <?xml version="1.0"?>
<menu>
<course name="appetizer">
<%= From m In menu _
Where m.Course = "appetizer" _
Select <dish><%= m.Food %></dish> _
%>
</course>
<course name="main">
<%= From m In menu _
Where m.Course = "main" _
Select <dish><%= m.Food %></dish> _
%>
</course>
<course name="dessert">
<%= From m In menu _
Where m.Course = "dessert" _
Select <dish><%= m.Food %></dish> _
%>
</course>
</menu>
Wenn Sie diese Zeile bedeuten:
_allDataTypes.Select(datatype => new XElement(_singularCamelNotation,
new XElement(datatype.CamelCaseNotation, datatype.GetDummyData())
))
und _allDataTypes ist eine Liste (Aufmerksamkeit ist kein LinQ!) Sie können dies tun:
_allDataTypes.ForEach(datatype => new XElement(_singularCamelNotation,
new XElement(datatype.CamelCaseNotation, datatype.GetDummyData())
))
beachten Sie dies funktioniert wirklich nur mit Liste.