2016-11-01 5 views
1

Quelqu'un peut-il m'aider à lire les valeurs dans xml avec son format?VB.net lire XML

Ci-dessous l'échantillon xml. Je dois obtenir les éléments suivants:

>id = 4ebc-9c89 
>employeeidnumber = 12345 
>name = Smith, John 
>weekday = 31/10/2016 
>reason = VL 

>weekday = 1/11/2016 
>reason = VL 

>id = 35bc-9c89 
>employeeidnumber = 54321 
>name = Smith, Jane 
>weekday = 1/11/2016 
>reason = VL* 

Si un employé a demandé deux ou plusieurs congés, le programme devrait obtenir tous ses congés.

<employeeleaverequest> 
     <leaverequest> 
     <id>4ebc-9c89</id> 
     <employeeidnumber>12345</employeeidnumber> 
     <name>Smith, John</name> 
     <company name="ABC Company">42b8</company>  
     <position name="08">-d00077504</position> 
     <dayleaverequest> 
      <weekday date="31/10/2016">2</weekday> 
      <segments> 
      <segment> 
       <id>ae2f2c</id> 
       <hours>8</hours> 
       <reason name="Vacation Leave">VL</reason> 
       <status>1</status> 
      </segment> 
      </segments> 
     </dayleaverequest> 
     <dayleaverequest> 
      <weekday date="1/11/2016">3</weekday> 
      <segments> 
      <segment> 
       <id>96898</id> 
       <hours>8</hours>  
      <reason name="Vacation Leave">VL</reason> 
      <status>1</status> 
      </segment> 
      </segments> 
     </dayleaverequest> 
     </leaverequest> 
     <leaverequest> 
     <id>35bc-9c89</id> 
     <employeeidnumber>54321</employeeidnumber> 
     <name>Smith, Jane</name> 
     <company name="ABC Company">42b8</company>  
     <position name="08">-d00077504</position> 
     <dayleaverequest> 
      <weekday date="1/11/2016">2</weekday> 
      <segments> 
      <segment> 
       <id>ae333c</id> 
       <hours>8</hours> 
       <reason name="Vacation Leave">VL</reason> 
       <status>1</status> 
      </segment> 
      </segments> 
     </dayleaverequest>  
     </leaverequest> 
    </employeeleaverequest> 

Voici mon code pour l'instant.

For Each Node As XmlElement In nodelist 
      strId = Node("id").InnerText 
       strNumber = Node("employeeidnumber").InnerText 
       strName = Node("name").InnerText 

       Dim sLeaveDay As XmlNode = >Node.SelectSingleNode("dayleaverequest") 
       If strLeaveDay IsNot Nothing Then 
        strLeaveDay = >sLeaveDay("weekday").Attributes.ItemOf("date").InnerText 
       End If 

       Dim sSegments As XmlNode = >Node.SelectSingleNode>("dayleaverequest/segments/segment") 
       If sSegments IsNot Nothing Then 
        strReason = sSegments("reason").InnerText    
       End If 

       MessageBox.Show(strId & "|" & strNumber & "|" & strName & >"|" & strLeaveDay & "|" & strReason) 
      Next 
+0

Vous devez ajouter quel est le problème avec le code actuel, une erreur (quel message), un comportement inattendu (lequel). Cela dit, si le code est ** exactement ** comme indiqué ici, je suspecte que le caractère '>' dispersé à travers le code joue un rôle dans le problème – Sehnsucht

+0

Le code ci-dessus ne prend que le premier congé pour chaque personne. Je veux boucler la boucle de jour afin qu'elle produise plusieurs congés si la personne a plusieurs congés. Je n'ai aucune idée d'où ils viennent. Mon code ici n'a pas ces caractères. – Marlofs

Répondre

0

Essayez xml LINQ:

Imports System.Xml 
Imports System.Xml.Linq 
Module Module1 
    Const FILENAME As String = "c:\temp\test.xml" 
    Sub Main() 
     Dim doc As XDocument = XDocument.Load(FILENAME) 

     Dim leaverequests = doc.Descendants("leaverequest").Select(Function(x) New With { 
        .id = x.Element("id"), 
        .employeeidnumber = x.Element("employeeidnumber"), 
        .name = x.Element("name"), 
        .company = x.Element("company"), 
        .postition = x.Element("position"), 
        .dayleaverequest = x.Elements("dayleaverequest").Select(Function(y) New With { 
         .weekday = y.Element("weekday").Value, 
         .date = y.Element("weekday").Attribute("date"), 
         .id = y.Descendants("id").FirstOrDefault(), 
         .hours = y.Descendants("hours").FirstOrDefault(), 
         .reason = y.Descendants("reason").Select(Function(z) CType(z.Value, String)).FirstOrDefault(), 
         .name = y.Descendants("reason").FirstOrDefault().Attribute("name").Value, 
         .status = y.Descendants("status").FirstOrDefault() 
        }).ToList() 
       }).ToList() 

    End Sub 

End Module 
+0

Appréciez-le @jdweng, malheureusement, pour une raison quelconque. Nous préférons utiliser le code comme ce que j'ai posté. – Marlofs

+0

Xml linq est une bibliothèque Microsoft Net améliorée qui a une meilleure capacité d'interrogation du fichier xml pour les tableaux. – jdweng

+1

@jdweng pas un gros problème, mais vous auriez pu utiliser des littéraux Xml pour faciliter la lisibilité et simplifier le code – Sehnsucht

0

j'ai pu résoudre mon problème.

C'est le code qui a résolu mon problème. Je viens de déclarer variable pour lire le dayleaverequest. Ensuite, j'utilise pour chaque boucle sur elle.

Pour chaque nœud Comme XmlElement Dans NodeList Strid = nœud ("id"). InnerText strNumber = nœud ("employeeidnumber"). InnerText strName = nœud ("name"). InnerText

Dim InnerNodeList As XmlNodeList = Node.SelectNodes("dayleaverequest") 

'loop through InnerNodeList(dayleaverequest) 
For Each InnerNode As XmlNode In InnerNodeList 
    strLeaveDay = InnerNode("weekday").Attributes.ItemOf("date").InnerText 

    Dim sSegments As XmlNode = Node.SelectSingleNode("dayleaverequest/segments/segment") 
    If sSegments IsNot Nothing Then 
     strReason = sSegments("reason").InnerText    
    End If 

    MessageBox.Show(strId & "|" & strNumber & "|" & strName & >"|" & strLeaveDay & "|" & strReason) 
Next 

Suivant