Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [c#] Leggere file xml "particolare"

    Salve, ho un'apparecchiatura elettrica che mi produce un file xml con tutti i risultati delle prove effettuate. Questo file vorrei innanzi tutto leggerlo, (poi il passo successivo sarà creare un pdf di report ed eventualmente memorizzare i dati in db).
    Ho provato le funzioni classiche per poter leggere il file ma non essendo perfettamente formattato va in errore.
    Riporto il file xml :
    codice:
    <XMLFile>
    	<Template>
    	<TestElement ID="22">
    		<PlugIn Name="ESA620" TestID="1240"/>
    		<Info>
    			<Type>Corrente di dispersione sull&apos;involucro</Type>
    			<Parameter>Condizioni normali, polarità inversa</Parameter>
    			<Name>Condizioni normali, polarità inversa</Name>
    		</Info>
    		<ExpectedResult>
    			<Standard AlphaName="IEC" CompleteName="IEC 60601" Type="Predefined">
    				<Limit Key="::ST">
    					<Unit>uA</Unit>
    					<Value Type="High">100</Value>
    				</Limit>
    			</Standard>
    		</ExpectedResult>
    	</TestElement>
    	.	.	.	.	.	.
    	<TestElement ID="35">
    		<PlugIn Name="ESA620" TestID="1500"/>
    		<Info>
    			<Type>Corrente ausiliaria paziente</Type>
    			<Name>Corrente ausiliaria paziente</Name>
    		</Info>
    		<ExpectedResult>
    			<Standard AlphaName="IEC" CompleteName="IEC 60601">
    				<Limit Key="::B">
    					<Unit>uA</Unit>
    				</Limit>
    				<Limit Key="::BF">
    					<Unit>uA</Unit>
    				</Limit>
    				<Limit Key="::CF">
    					<Unit>uA</Unit>
    				</Limit>
    				<Limit Key="::B_DC">
    					<Unit>uA</Unit>
    				</Limit>
    				<Limit Key="::BF_DC">
    					<Unit>uA</Unit>
    				</Limit>
    				<Limit Key="::CF_DC">
    					<Unit>uA</Unit>
    				</Limit>
    			</Standard>
    		</ExpectedResult>
    		<PlugInData PlugIn="ESA620">
    			<ValueFilter>None</ValueFilter>
    			<EnableBtn Skip="True" NA="True" Step="True"/>
    			<ModuleOptions Sep="False" Exp="False" Stop="False"/>
    			<TestOptions>
    				<Run Opt="False" HaltOnFail="True" MultiPE="False" TotalLeakage="False" MeasType="0" TestVoltage="0" AppliedParts="0"/>
    				<StopOnPC Before="False" After="False"/>
    				<Delay On="2" Off="0"/>
    			</TestOptions>
    		</PlugInData>
    		<TestElement ID="36">
    			<PlugIn Name="ESA620" TestID="1510"/>
    				<Info>
    					<Type>Corrente ausiliaria paziente</Type>
    					<Parameter>Condizioni normali</Parameter>
    					<Name>Condizioni normali</Name>
    				</Info>
    				<ExpectedResult>
    				<Standard AlphaName="IEC" CompleteName="IEC 60601" Type="Predefined">
    					<Limit Key="::B">
    						<Unit>uA</Unit>
    						<Value Type="High">100</Value>
    					</Limit>
    					<Limit Key="::BF">
    						<Unit>uA</Unit>
    						<Value Type="High">100</Value>
    					</Limit>
    					<Limit Key="::CF">
    						<Unit>uA</Unit>
    						<Value Type="High">10</Value>
    					</Limit>
    					<Limit Key="::B_DC">
    						<Unit>uA</Unit>
    						<Value Type="High">10</Value>
    					</Limit>
    					<Limit Key="::BF_DC">
    						<Unit>uA</Unit>
    						<Value Type="High">10</Value>
    					</Limit>
    					<Limit Key="::CF_DC">
    						<Unit>uA</Unit>
    						<Value Type="High">10</Value>
    					</Limit>
    				</Standard>
    			</ExpectedResult>
    		</TestElement>
    		<TestElement ID="37">
    			<PlugIn Name="ESA620" TestID="1520"/>
    			<Info>
    				<Type>Corrente ausiliaria paziente</Type>
    				<Parameter>Neutro aperto</Parameter>
    				<Name>Neutro aperto</Name>
    			</Info>
    			<ExpectedResult>
    				<Standard AlphaName="IEC" CompleteName="IEC 60601" Type="Predefined">
    					<Limit Key="::B">
    						<Unit>uA</Unit>
    						<Value Type="High">500</Value>
    					</Limit>
    					<Limit Key="::BF">
    						<Unit>uA</Unit>
    						<Value Type="High">500</Value>
    					</Limit>
    					<Limit Key="::CF">
    						<Unit>uA</Unit>
    						<Value Type="High">50</Value>
    					</Limit>
    					<Limit Key="::B_DC">
    						<Unit>uA</Unit>
    						<Value Type="High">50</Value>
    					</Limit>
    					<Limit Key="::BF_DC">
    						<Unit>uA</Unit>
    						<Value Type="High">50</Value>
    					</Limit>
    					<Limit Key="::CF_DC">
    						<Unit>uA</Unit>
    						<Value Type="High">50</Value>
    					</Limit>
    				</Standard>
    			</ExpectedResult>
    		</TestElement>
    		<TestElement ID="38">
    	.	.	.	.	.
    		</TestElement>
    	</TestElement>
    	</Template>
    	<Result>
    	<ResultItem MTI="1" ElementID="22">
    		<Status>Passed</Status>
    		<Measurement Key="::ST">
    			<Description>Condizioni normali, polarità inversa</Description>
    			<Value Type="Float">.2</Value>
    			<Unit>uA</Unit>
    			<Status>Passed</Status>
    		</Measurement>
    	</ResultItem>
    	.	.	.	.	.	
    	<ResultItem ElementID="35">
    		<Status>Passed</Status>
    		<ResultItem MTI="1" ElementID="36">
    			<Status>Passed</Status>
    			<Measurement Key="::1::B">
    				<Description>circuito paziente</Description>
    				<Value Type="Float">.1</Value>
    				<Unit>uA</Unit>
    				<Status>Passed</Status>
    			</Measurement>
    			<Measurement Key="::2::CF">
    				<Description>ECG</Description>
    				<Value Type="Float">.1</Value>
    				<Unit>uA</Unit>
    				<Status>Passed</Status>
    			</Measurement>
    			<Measurement Key="::3::B">
    				<Description>Spo2</Description>
    				<Value Type="Float">.1</Value>
    				<Unit>uA</Unit>
    				<Status>Passed</Status>
    			</Measurement>
    			<Measurement Key="::4::B">
    				<Description>NiBp</Description>
    				<Value Type="Float">.1</Value>
    				<Unit>uA</Unit>
    				<Status>Passed</Status>
    			</Measurement>
    		</ResultItem>
    		<ResultItem MTI="1" ElementID="37">
    			<Status>Passed</Status>
    			<Measurement Key="::1::B">
    				<Description>circuito paziente</Description>
    				<Value Type="Float">.1</Value>
    				<Unit>uA</Unit>
    				<Status>Passed</Status>
    			</Measurement>
    			<Measurement Key="::2::CF">
    				<Description>ECG</Description>
    				<Value Type="Float">.1</Value>
    				<Unit>uA</Unit>
    				<Status>Passed</Status>
    			</Measurement>
    			<Measurement Key="::3::B">
    				<Description>Spo2</Description>
    				<Value Type="Float">.1</Value>
    				<Unit>uA</Unit>
    				<Status>Passed</Status>
    			</Measurement>
    			<Measurement Key="::4::B">
    				<Description>NiBp</Description>
    				<Value Type="Float">.1</Value>
    				<Unit>uA</Unit>
    				<Status>Passed</Status>
    			</Measurement>
    		</ResultItem>
        <ResultItem MTI="1" ElementID="38">
    	.	.	.	.	.	.
    	</ResultItem>
    	</ResultItem>
    	</Result>
    	</XMLFile>
    Il file e' formato da due parti: la prima e' il template e la seconda parte è formata dai risultati.
    Ho provato a leggerlo con il codice riportato sotto, ma non mi funziona il foreach dei risultati:


    codice:
    using System;
    using System.Linq;
    using System.Xml.Linq;
    
    namespace ConsoleApplication23
    {
        class Program
        {
            static void Main(string[] args)
            {
                XDocument document = XDocument.Load("Data.xml");
                #region Fetch All the Books
                var Template = from t in document.Descendants("TemplateData").Descendants("TestElement")
                            select new
                            {
                                PlugIn = (string) t.Element("ExpectedResult").Element("Standard").Attribute("CompleteName").Value,
                                IDT = (string) t.Attribute("ID"),
                                Tipo = (string) t.Element("Info").Element("Type").Value,
                                Nome = (string) t.Element("Info").Element("Name").Value,
                                Parameter = (string) t.Element("Info").Element("Parameter") ?? "",
    
                            };
    
                foreach (var t in Template)
                {
                    var Result = from r in document.Descendants("ResultData").Descendants("ResultItem").Where(r => (string)r.Attribute("ElementID") == t.IDT)
                                 select new
                                 {
                                     IDR = (string) r.Attribute("ElementID").Value ?? "",
                                     StatusGroup = (string) r.Element("Status").Value ?? "",
                                     Description = (string) r.Element("Measurement").Element("Description").Value ?? "",
                                     Value = (string) r.Element("Measurement").Element("Value").Value ?? "",
                                     Unit = (string) r.Element("Measurement").Element("Unit").Value ?? "",
                                     Status = (string) r.Element("Measurement").Element("Status").Value ?? "",
                                 };
                }
    
                
                Console.ReadKey(true);
                #endregion
                     
            }
        }
    }

    Quello che tento di ottenere è:

    Corrente di dispersione sull'involucro:
    Condizioni normali, polarit'inversa,
    Unit: uA, Limit High:100, Value: .2, Status Passed

    Corrente ausiliaria paziente:
    Corrente ausiliaria paziente:
    Patient Circuit: Unit:uA, Limit High: 100, Value: .1 Status: Passed
    ECG: Unit:uA, Limit High: 10, Value: .1 Status: Passed
    Spo2: Unit:uA, Limit High: 100, Value: .1 Status: Passed
    NiBp: Unit:uA, Limit High: 100, Value: .1 Status: Passed

    Neutral Open:
    Patient current Auxiliary:
    Patient Circuit: Unit:uA, Limit High: 500, Value: .1 Status: Passed
    ECG: Unit:uA, Limit High: 50, Value: .1 Status: Passed
    Spo2: Unit:uA, Limit High: 500, Value: .1 Status: Passed
    NiBp: Unit:uA, Limit High: 500, Value: .1 Status: Passed

    Come posso fare ????

    Grazie anticipatamente per l'aiuto

  2. #2
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    il secondo foreach lo devi fare sui risultati che sono un altro pezzo del file xml e non in template. a occhio dovrebbe essere cosi
    codice:
    var Risultati = from t in document.Descendants("Result").Descendants("ResultItem")
    foreach(var r in Risultati)

  3. #3
    Mettevo in relazione "Template" e "Result" con la clausola .Where(r => (string)r.Attribute("ElementID") == t.IDT), in quanto posso avere più risultati per ogni singolo elemento del template

  4. #4
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    hai ragione, ho dato un occhiata piu precisa al codice.
    Quello che mi viene in mente sono le etichette (Result o ResultData?).
    In ogni caso di preciso che errore ti da?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.