2016-11-01 165 views
1

有人能帮助我如何读取xml中的值与他的格式?以下是xml样本。我需要得到以下内容:VB.net阅读XML

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

如果员工申请两个或更多假期,程序应该获得他/她的所有叶子。

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

这是我的代码到目前为止。

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

您应该添加什么是当前代码的问题,一个错误(哪个消息),一个意外的行为(哪一个)。也就是说,如果代码完全**,如下所示,我怀疑那些散布在代码中的字符散布在问题中 – Sehnsucht

+0

上面的代码只是为每个人选择第一个假。我想循环dayleaverequest,以便它会输出多个假如果有多个假期。我不知道那些来自哪里。我的代码没有这些字符。 – Marlofs

回答

0

尝试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

不幸的是,由于某种原因,欣赏@jdweng。我们更喜欢使用我发布的代码。 – Marlofs

+0

Xml linq是一个增强的Microsoft Net Library,它具有更好的查询数组xml文件的能力。 – jdweng

+1

@jdweng不是什么大不了的,但你可以使用Xml Literals来减轻可读性并简化代码 – Sehnsucht

0

我能解决我自己的问题。

这是解决我的问题的代码。我只是声明变量来读取dayleaverequest。然后我使用它的每个循环。

对于每个节点的XmlElement在节点列表strId =节点( “ID”)。的innerText strNumber =节点( “employeeidnumber”)。的innerText则strName =节点( “名称”)。的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 

下一页