Laden...

Wie kann Ich eine XML mit einem vorhanden Wert nach dessen weiteren Attributen dursuchen?

Erstellt von omega90 vor 10 Jahren Letzter Beitrag vor 10 Jahren 989 Views
O
omega90 Themenstarter:in
51 Beiträge seit 2012
vor 10 Jahren
Wie kann Ich eine XML mit einem vorhanden Wert nach dessen weiteren Attributen dursuchen?

hallo zusammen
**
Ich erzähl ein wenig über mein Projekt: LIC Reader**

Wir arbeiten im Unternehmen mit dem FLEXlm, dies ist ein Lizenzmanager. Bestimmte Lizenzen werden bereitgestellt und an Personen verteilt und wieder zurück gegeben. Mein Aufgabe ist es nun für die Personen die sich Lizenzen ziehen ein kleines Tool zu schreiben wo man sehen kann welches Modul gerade in Verwendung ist und welche Benutzer darauf zugreifen und wie viele Lizenzen ziehen. Hört Sich eigentlich alles nicht so schwer an.

**Was Ich bis jetzt geschafft habe: **

Ich erhalte von dem Lizenzserver über ein CMD Befehl eine XML zurück und speicher diese in einem String. Da diese nicht direkt mit

<?xml version="1.0" encoding="UTF-8"?>

beginnt entferne ich alle Zeichen vorher damit meine XML gültig ist. Wie auch immer. Ich lese diesen string im XmlReader ein und übergebe das Object xDoc via Xdocument.Load(...). Mit Linq filter Ich meine XML nach den Nodes und unter Nodes aus die Ich benötige. Ein Beispiel der XML werde Ich ganz am Ende bereitstellen.
Ich verwende ein TreeView in dem Dann die Nodes aufgelistet werden und desen unternodes. In meinem Fall die Module(FEATURES) und deren Benutzer(USER). Sobald Ich doppelklick auf einen der Nodes oder unternodes mache erhalte Ich den Wert in einer TextBox. Rein zum testen.

**Was Ich noch vorhabe: **

Ich möchte diesen Wert den Ich aus dem Note heraus erhalte verwenden um weitere Informationen über das Note und dessen Attribute zu erhalten. Zum Beipiel klicke Ich auf das Modul Hyperworks, dann möchte ich von der Node FEATURE mit dem Attribut NAME="Hyperworks" auch die Attribuuten VERSION="" und weitere auslesen und diese in irgendeiner form darstellen. LISTVIEW oder GRIDVIEW bzw. erst mal in einer DataTable speichern bzw array. Da bin Ich noch offen.
Zudem sollen dann auch alle benutzer augelistet werden die das Modul gerade beanspruchen.

Fazit: Ich möchte über einen Attributwert den Ich habe wie NAME="hyperworks" die weiteren attribute auslesen wenn das geht.

**Mein Code: **

Das passiert wenn ich auf auflisten klicke und Sich dann die treeview füllt

private void btnShowLicstate_Click(object sender, EventArgs e)
        {
            treeLic.Nodes.Clear(); 

            string command = "\"C:\\lmxendutil.exe\" -licstatxml -host lwserv005 -port 6200";

            string output = ExecuteCommand(command);
            string final_output = output.Substring(90, output.Length - 90);

            XmlReader xr = XmlReader.Create(new StringReader(final_output));

            

            var xDoc = XDocument.Load(xr); 
                TreeNode root = new TreeNode();
                LoadTree(xDoc.Root.Element("LICENSE_PATH"), root);
                treeLic.Nodes.Add(root);

                treeLic.ImageList = imageList1; 

        }
public void LoadTree(XElement root, TreeNode rootNode)
        {
            foreach (var e in root.Elements().Where(e => e.Attribute("NAME") != null))
            {
                var node = new TreeNode(e.Attribute("NAME").Value);


                rootNode.Nodes.Add(node);

                if (e.Name == "FEATURE")
                {
                    node.ImageIndex = 1;
                    
                }
                else if (e.Name == "USER")
                {
                    node.ImageIndex = 0;
                   
                }

                LoadTree(e, node);
            }
        }

private static string ExecuteCommand(string command)
        {
            int exitCode;
            ProcessStartInfo processInfo;
            Process process;

            processInfo = new ProcessStartInfo("cmd.exe", "/c " + command);
            processInfo.CreateNoWindow = true;
            processInfo.UseShellExecute = false;
            processInfo.RedirectStandardError = true;
            processInfo.RedirectStandardOutput = true;

            process = Process.Start(processInfo);
           
            string output = process.StandardOutput.ReadToEnd();
            exitCode = process.ExitCode;

            process.Close();

            return output; 
        }

private void treeLic_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            try
            {
                TreeNode node = treeLic.SelectedNode;

                string selectedValue = node.Text;

                txtOutput.Text = selectedValue;
            }
            catch (Exception)
            {
                
            }

        }

**Hier ein kleiner Auschnitt aus der XML: **

<?xml version="1.0" encoding="UTF-8"?>
<LM-X STAT_VERSION="3.32">
<LICENSE_PATH TYPE="NETWORK" HOST="6200@lwserv005" SERVER_VERSION="4.4.4" UPTIME="53 day(s) 21 hour(s) 10 min(s) 50 sec(s)">
<FEATURE NAME="GlobalZoneEU" VERSION="12.0" VENDOR="ALTAIR" START="2013-03-26" END="2014-03-31" USED_LICENSES="111720" TOTAL_LICENSES="147000" SHARE="CUSTOM ,VIRTUAL">
<USER NAME="SYSTEM" HOST="LWSERV171" IP="172.16.11.115" USED_LICENSES="2000" LOGIN_TIME="2013-04-17 12:42" CHECKOUT_TIME="2013-04-17 12:42" SHARE_CUSTOM="hweuser:172.16.11.115"/>
>
<USER NAME="pbsadmin" HOST="LWSERV171" IP="172.16.11.115" USED_LICENSES="720" LOGIN_TIME="2013-04-17 12:44" CHECKOUT_TIME="2013-04-17 12:44" SHARE_CUSTOM="pbsadmin:LWSERV171:1592_40960072_1356792762_826820"/>
>
<USER NAME="Bell.M" HOST="DBG4327" IP="172.16.225.105" USED_LICENSES="21000" LOGIN_TIME="2013-05-21 07:52" CHECKOUT_TIME="2013-05-21 07:52" SHARE_CUSTOM="Bell.M:DBG4327"/>
>
<USER NAME="Bell.M" HOST="DBG4327" IP="172.16.225.105" USED_LICENSES="6000" LOGIN_TIME="2013-05-21 07:54" CHECKOUT_TIME="2013-05-21 07:54" SHARE_CUSTOM="Bell.M:DBG4327"/>
>
<USER NAME="xu.d" HOST="DBG4970" IP="172.16.225.126" USED_LICENSES="21000" LOGIN_TIME="2013-05-21 08:15" CHECKOUT_TIME="2013-05-21 08:15" SHARE_CUSTOM="xu.d:DBG4970"/>
>
<USER NAME="xu.d" HOST="DBG4970" IP="172.16.225.126" USED_LICENSES="21000" LOGIN_TIME="2013-05-21 08:18" CHECKOUT_TIME="2013-05-21 08:18" SHARE_CUSTOM="xu.d:DBG4970"/>
>
<USER NAME="Bell.M" HOST="DBG4327" IP="172.16.225.105" USED_LICENSES="21000" LOGIN_TIME="2013-05-21 08:23" CHECKOUT_TIME="2013-05-21 08:23" SHARE_CUSTOM="Bell.M:DBG4327"/>
>
<USER NAME="xu.d" HOST="SIM02" IP="172.16.32.12" USED_LICENSES="21000" LOGIN_TIME="2013-05-21 08:36" CHECKOUT_TIME="2013-05-21 08:36" SHARE_CUSTOM="xu.d:SIM02"/>
>
<USER NAME="xu.d" HOST="SIM02" IP="172.16.32.12" USED_LICENSES="6000" LOGIN_TIME="2013-05-21 08:37" CHECKOUT_TIME="2013-05-21 08:37" SHARE_CUSTOM="xu.d:SIM02"/>
>
<USER NAME="hassan.a" HOST="DBG5199" IP="172.16.225.114" USED_LICENSES="21000" LOGIN_TIME="2013-05-21 09:24" CHECKOUT_TIME="2013-05-21 09:24" SHARE_CUSTOM="hassan.a:DBG5199"/>
>
<USER NAME="xu.d" HOST="SIM02" IP="172.16.32.12" USED_LICENSES="21000" LOGIN_TIME="2013-05-21 09:33" CHECKOUT_TIME="2013-05-21 09:33" SHARE_CUSTOM="xu.d:SIM02"/>
>
<USER NAME="xu.d" HOST="SIM02" IP="172.16.32.12" USED_LICENSES="6000" LOGIN_TIME="2013-05-21 09:33" CHECKOUT_TIME="2013-05-21 09:33" SHARE_CUSTOM="xu.d:SIM02"/>
>
<USER NAME="xu.d" HOST="SIM02" IP="172.16.32.12" USED_LICENSES="2000" LOGIN_TIME="2013-05-21 09:39" CHECKOUT_TIME="2013-05-21 09:39" SHARE_CUSTOM="xu.d:SIM02"/>
>
<USER NAME="zeiser-rasumak.a" HOST="DBG5200" IP="172.16.225.127" USED_LICENSES="21000" LOGIN_TIME="2013-05-21 10:05" CHECKOUT_TIME="2013-05-21 10:05" SHARE_CUSTOM="zeiser-rasumak.a:DBG5200"/>
>
<USER NAME="xu.d" HOST="DBG4970" IP="172.16.225.126" USED_LICENSES="25000" LOGIN_TIME="2013-05-21 10:25" CHECKOUT_TIME="2013-05-21 10:25" SHARE_CUSTOM="xu.d:DBG4970"/>
>
<USER NAME="zeiser-rasumak.a" HOST="DBG5200" IP="172.16.225.127" USED_LICENSES="21000" LOGIN_TIME="2013-05-21 11:27" CHECKOUT_TIME="2013-05-21 11:27" SHARE_CUSTOM="zeiser-rasumak.a:DBG5200"/>
>
<USER NAME="zeiser-rasumak.a" HOST="DBG5200" IP="172.16.225.127" USED_LICENSES="2000" LOGIN_TIME="2013-05-21 11:48" CHECKOUT_TIME="2013-05-21 11:48" SHARE_CUSTOM="zeiser-rasumak.a:DBG5200"/>
>
<USER NAME="zeiser-rasumak.a" HOST="DBG5200" IP="172.16.225.127" USED_LICENSES="21000" LOGIN_TIME="2013-05-21 11:49" CHECKOUT_TIME="2013-05-21 11:49" SHARE_CUSTOM="zeiser-rasumak.a:DBG5200"/>
</FEATURE>
<FEATURE NAME="HWAIFPBS" VERSION="12.0" VENDOR="ALTAIR" START="2013-03-26" END="2014-03-31" USED_LICENSES="0" TOTAL_LICENSES="2147483647" SHARE="CUSTOM ,VIRTUAL"/>
<FEATURE NAME="HWAWPF" VERSION="12.0" VENDOR="ALTAIR" START="2013-03-26" END="2014-03-31" USED_LICENSES="0" TOTAL_LICENSES="2147483647" SHARE="CUSTOM ,VIRTUAL"/>

Ich bin leider nicht der beste im Linq bin ja auch noch am lernen (Azubi) 😃
Hilfe wäre super 😃 danke

Gruß W.T 🙂

C
2.121 Beiträge seit 2010
vor 10 Jahren

Nicht Kritik, sondern nur ein Tip für dich zum Fragestellen. Ich hab mir den Beitrag mehrmals durchgelesen, ich glaube der Kern deiner Frage ist das hier

Ich möchte über einen Attributwert den Ich habe wie NAME="hyperworks" die weiteren attribute auslesen wenn das geht.

Du willst also wissen wie du einen XML Knoten findest, wenn du den Wert eines Attributs hast. Der ganze Rest in deinem Beitrag lenkt ziemlich davon ab.

Das kannst du entweder lösen indem du der Reihe nach alle Knoten selber nach dem Attribut durchsuchst, oder du nutzt "XPath". Wie das geht steht in der Doku sicher um einiges besser als ich es mit gerade kaum Zeit erklären könnte. Das Stichwort sollte dich aber schon um einiges weiter bringen.

W
955 Beiträge seit 2010
vor 10 Jahren

Hi,

Du kannst Linq2Xml ruhig verwenden wenn Du es schon einsetzt. Das geht dann


xDoc.Descendants("LICENSE_PATH").Descendants("FEATURE").Descendants("USER").FirstOrDefault();
...

Du kannst damit auch entsprechend filtern.
Wenn Du sehr oft diese Objekte anfassen musst würde ich sie in Modellobjekte überführen (class LicensePath, Feature, User) und in dort die Verschachtelungshierarchie und die XML-Attribute abbilden. Diese kannst Du dann an Dein TreeView binden und auch entsprechend durchsuchen/filtern.