Laden...

(tief) geschachteltes XmlDocument mit weniger/einfacherem/übersichtlicherem Code enumerieren

Erstellt von blackdns vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.456 Views
B
blackdns Themenstarter:in
11 Beiträge seit 2013
vor 10 Jahren
(tief) geschachteltes XmlDocument mit weniger/einfacherem/übersichtlicherem Code enumerieren

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>
64 Beiträge seit 2012
vor 10 Jahren

Da XML ja einer Baumstruktur ähnelt würde ich Rekursion empfehlen

++Rekursion ++
(lat. , die) siehe Rekursion

16.806 Beiträge seit 2008
vor 10 Jahren

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 )
    {
         // ...
    }
}


W
872 Beiträge seit 2005
vor 10 Jahren

Hast Du Zugriff auf eine xsd Schema zu Deinen XML-Dateien?
Wuerde dann ueberlegen mit xsd2code Klassen generieren, dann bekommst Du darüber eine Struktur.
Das Befuellen der Struktur wird dann mehr zu einer mechanischen Arbeit.

849 Beiträge seit 2006
vor 10 Jahren

Und wenn nicht kann er das gut mit dem xsd.exe (VS) tool aus dem Xml Generieren 😃

B
blackdns Themenstarter:in
11 Beiträge seit 2013
vor 10 Jahren

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!!

C
80 Beiträge seit 2010
vor 10 Jahren

Was spricht gegen LINQ to XML? Damit lässt sich die XML viel schöner parsen.

16.806 Beiträge seit 2008
vor 10 Jahren

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.