Hallo zusammen,
habe ein wenig Probleme damit zu verstehen, wie genau die Enumeration von XMLs in .NET von statten geht, und denke, dass ich den folgenden Code deutlich simpler gestalten können MÜSSTE!
Vielleicht kann mir jemand einen Fingerzeig geben.
Vielen Dank im Voraus.
Code:
XmlDocument xmldoc = new XmlDocument();
xmldoc.LoadXml(settings);
foreach (XmlNode node in xmldoc.GetElementsByTagName("DialogFields"))
{
foreach (XmlNode innerNode in node)
{
if (sListField.FileCabinetField != null && innerNode.Attributes["name"].Value == sListField.FileCabinetField.DatabaseName)
{
foreach (XmlNode innerinnerNode in innerNode.ChildNodes)
{
if (innerinnerNode.Name == "FieldEntry")
{
foreach (XmlNode innerinnerinnerNode in innerinnerNode)
{
if (innerinnerinnerNode.Name == "FixedText" && innerinnerinnerNode.Attributes["isFixedEntry"].Value == "true")
{
string minValue = innerinnerinnerNode.ChildNodes[0].InnerText;
string maxValue = innerinnerinnerNode.ChildNodes[1].InnerText;
if (minValue != String.Empty)
{
if (maxValue != String.Empty)
searchCommand.AddCriterion(sListField.FileCabinetField, minValue, maxValue);
else
searchCommand.AddCriterion(sListField.FileCabinetField, minValue);
}
}
}
}
}
}
}
}
XML:
<?xml version="1.0" encoding="UTF-8"?>
<SearchDialog fID="1" fGuid="a4f2d397-3d53-433b-9334-e4e7cd7e8ab2" guid="9a540537-d3aa-490d-953b-266a61184999" name="Testfirma" default="false" usage="NormalClients" version="5.1.0.1">
<Properties resultListGuid="844f9be5-fc15-4b18-8d2f-06444d1dbca2">
<LogicalOperators show="true" defaultOperator="AND" />
</Properties>
<DialogFields>
<DialogField name="COMPANY" visible="true" orderNumber="1" guid="0f5d3b6a-5013-44f7-a7f3-bf40c1b198e6">
<FieldLabel>
<Name>Firma</Name>
</FieldLabel>
<FieldEntry allowExtendedSearch="false">
<AddWildcards>false</AddWildcards>
<FixedText lock="false" enabled="true" isFixedEntry="true" predefinedEntry="EMPTY" type="Both">
<Min>
<TextVar length="-1">TESTFIRMA</TextVar>
</Min>
<Max>
<Text20 />
</Max>
</FixedText>
<MaskGuid>00000000-0000-0000-0000-000000000000</MaskGuid>
<ExtSelectLists>
<ExtSelectList guid="00000000-0000-0000-0000-000000000000" isDWInternalSelectList="true">Standard Auswahlliste</ExtSelectList>
</ExtSelectLists>
</FieldEntry>
</DialogField>
<DialogField name="CONTACT" visible="true" orderNumber="2" guid="a53e1135-83f5-440b-89fd-113d3fef7998">
<FieldLabel>
<Name>Kontakt</Name>
</FieldLabel>
<FieldEntry allowExtendedSearch="false">
<AddWildcards>false</AddWildcards>
<FixedText lock="false" enabled="false" isFixedEntry="false" predefinedEntry="CURRENTDATE" type="Both">
<Min>
<TextVar length="-1" />
</Min>
<Max>
<Text20 />
</Max>
</FixedText>
<MaskGuid>00000000-0000-0000-0000-000000000000</MaskGuid>
<ExtSelectLists>
<ExtSelectList guid="00000000-0000-0000-0000-000000000000" isDWInternalSelectList="true">Standard Auswahlliste</ExtSelectList>
</ExtSelectLists>
</FieldEntry>
</DialogField>
</DialogFields>
</SearchDialog>
Da XML ja einer Baumstruktur ähnelt würde ich Rekursion empfehlen
++Rekursion ++
(lat. , die) siehe Rekursion
Angesichts dessen, dass die Struktur eben nicht Rekursiv ist (anders zB bei Ordner und Dateien eines FileSystems) würde gar keine andere Struktur nehmen; ich würde nur die Klasse anders aufbauen.
Jede Node wie Search hat seine eigene Klassen, die ihren eigenen Inhalt kennen und dann kaskadiert diesen parsen.
public class SearchDialog
{
public IEnumerable<DialogField> DialogFields { get; private set; }
public static SearchDialog Parse( XElement searchDialogNode )
{
var sd = new SearchDialog ( );
var dialogFieldsNode = searchDialogNode.Element( "DialogFields" );
sd.DialogFields = dialogFieldsNode.Elements( "DialogField" ).Select(df => DialogField.Parse( df );
return sd;
}
}
public class DialogField
{
public static DialogField Parse( XElement dialogFieldNode )
{
// ...
}
}
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Und wenn nicht kann er das gut mit dem xsd.exe (VS) tool aus dem Xml Generieren 😃
Danke jungs 😃
Eine xsd habe ich leider nicht, auf das Tool war ich auch schon gestoßen 😉
@abt: vielen Dank auch dir, werde deine Lösung später mal ausprobieren und ggf. auf dich zurück kommen!!
Was spricht gegen LINQ to XML? Damit lässt sich die XML viel schöner parsen.
Falls es Dir nich aufgefallen ist verwendet mein Beispiel im Prinzip die Grundzüge von Linq2XML.
Der Vorteil hierbei ist: nur die Node selbst kennt seinen Inhalt - das spricht auch gleichzeitig gegen reines linq2XML.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code