2015-11-12 4 views
0

У меня есть файл большого размера xml (> 500mb), как тот, который показан ниже.уникальные значения от XML до combobox

<?xml version="1.0" encoding="UTF-8"?> 
<ChangeRequests Count="" ID="" Update=""> 
    <Requests> 
     <Request Type="Insert" Method="Customer"> 
      <Country>xXx</Country> 
      <Window>10</Window> 
      <Door>11</Door> 
      <Id>88747</Id> 
      <Name>Lore Ipsum</Name> 
      <FirstName /> 
      <OwnerFirstName /> 
      <OwnerName /> 
      <OwnerBirthday /> 
      <CompanyName1 /> 
      <CompanyName1 /> 
     </Request> 
      <Request Type="Insert" Method="Customer"> 
      <Country>xXx</Country> 
      <Window>10</Window> 
      <Door>11</Door> 
      <Id>444544</Id> 
      <Name>Lazy Dog</Name> 
      <FirstName /> 
      <OwnerFirstName /> 
      <OwnerName /> 
      <OwnerBirthday /> 
      <CompanyName1 /> 
      <CompanyName1 /> 
     </Request> 
      <Request Type="Insert" Method="Customer"> 
      <Country>xXx</Country> 
      <Window>10</Window> 
      <Door>11</Door> 
      <Id>444544</Id> 
      <Name>Lazy Dog</Name> 
      <FirstName /> 
      <OwnerFirstName /> 
      <OwnerName /> 
      <OwnerBirthday /> 
      <CompanyName1 /> 
      <CompanyName1 /> 
      </Request> 
    </Requests> 
</ChangeRequests> 

я хотел бы прочитать первый узел запроса и добавить в выпадающий список всех своих Чайлдс, не читать другую часть XML. код, который я придумал, является приведенным ниже, но он проходит через все из них, и он добавит в комбинированное поле много повторяющихся значений.

Dim xml_doc As New XmlDocument 
    Dim xmlReader As New XmlTextReader(TextBox1.Text) 
    Dim arr As New ArrayList 
    xmlReader.MoveToContent() 
    xmlReader.ReadToFollowing("Request") 
    While xmlReader.Read() 
     Select Case xmlReader.NodeType 
      Case XmlNodeType.Element 
       ComboBox1.Items.Add("<" + xmlReader.Name & ">") 
       Exit Select 
     End Select 
    End While 

ответ

0

Если вы хотите, чтобы читать дети первого Request элемента, вы можете проверить на конец Request элемента и выхода из цикла:

While xmlReader.Read() 
    If xmlReader.NodeType = XmlNodeType.EndElement AndAlso xmlReader.Name = "Request" Then 
     Exit While 
    End If 
    Select Case xmlReader.NodeType 
     ' ... 

Это будет по-прежнему оставит вас с дубликатами для любых дочерних элементов, которые повторяются, например <CompanyName1> ... но, возможно, все в порядке. Если вы хотите дедуплицировать те, метод Linq в Distinct может помочь там:

Dim xmlReader As New XmlTextReader(TextBox1.Text) 
xmlReader.MoveToContent() 
xmlReader.ReadToFollowing("Request") 
' Collect the names in a List 
Dim elementNames As New List(Of String)() 
While xmlReader.Read() 
    Select Case xmlReader.NodeType 
     Case XmlNodeType.Element 
      elementNames.Add("<" + xmlReader.Name & ">") 
      Exit Select 
    End Select 
End While 
' Add distinct values to the ComboBox 
ComboBox1.Items.AddRange(elementNames.Distinct().ToArray()) 
+0

работает как шарм, спасибо вам 1000 раз за это !! –

Смежные вопросы