Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

(tief) geschachteltes XmlDocument mit weniger/einfacherem/übersichtlicherem Code enumerieren
blackdns
myCSharp.de - Member



Dabei seit:
Beiträge: 11

Themenstarter:

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

beantworten | zitieren | melden

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>
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von blackdns am .
private Nachricht | Beiträge des Benutzers
EifelYeti
myCSharp.de - Member

Avatar #avatar-3408.jpeg


Dabei seit:
Beiträge: 66
Herkunft: Eifel

beantworten | zitieren | melden

Da XML ja einer Baumstruktur ähnelt würde ich Rekursion empfehlen
Rekursion
(lat. , die) siehe Rekursion
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15980

beantworten | zitieren | melden

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 - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
weismat
myCSharp.de - Member



Dabei seit:
Beiträge: 878
Herkunft: Frankfurt am Main

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
unconnected
myCSharp.de - Member

Avatar #avatar-3200.jpg


Dabei seit:
Beiträge: 862
Herkunft: Oerlinghausen/NRW

beantworten | zitieren | melden

Und wenn nicht kann er das gut mit dem xsd.exe (VS) tool aus dem Xml Generieren :)
private Nachricht | Beiträge des Benutzers
blackdns
myCSharp.de - Member



Dabei seit:
Beiträge: 11

Themenstarter:

beantworten | zitieren | melden

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!!
private Nachricht | Beiträge des Benutzers
CSharperUser
myCSharp.de - Member



Dabei seit:
Beiträge: 81

beantworten | zitieren | melden

Was spricht gegen LINQ to XML? Damit lässt sich die XML viel schöner parsen.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15980

beantworten | zitieren | melden

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 - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers