Как читать многоуровневый xml в vb.net, привязать к radgrid - PullRequest
0 голосов
/ 29 июля 2010

Пожалуйста, помогите мне прочитать этот многоуровневый XML-файл в RadGrid. 1) я планирую не использовать Aspx для этого 2) узел с именем Item в конечном итоге изменится в соответствии с требованиями приложения. Поэтому я не хочу ограничивать свой xpath чем-то вроде "// Product / Item"

<Products>  
      <Product ProductID="1">  
        <Item ItemID="1">  
          <ProductNo>1234</ProductNo>  
          <Description>  
            <ManufacDate>20100526T12:00:01.012</ManufacDate>  
            <ManufacID>72</ManufacID>  
          </Description>  
        </Item>  
        <Item ItemID="2">  
          <ProductNo>1235</ProductNo>  
          <Description>  
            <ManufacDate>20100527T12:00:01.012</ManufacDate>  
            <ManufacID>72</ManufacID>  
          </Description>  
        </Item>  
        <Item ItemID="3">  
          <ProductNo>1236</ProductNo>  
          <Description>  
            <ManufacDate>20100528T12:00:01.012</ManufacDate>  
            <ManufacID>66</ManufacID>  
          </Description>  
        </Item>  
     </Product></Products>

Я читаю этот xml из codebehind и перебираю xmlnodes для отображения в сетке. Пожалуйста, найдите мой фрагмент ниже:

Dim root as new xmldocument()  

' After loading the above xml into root   

Dim ndl As XmlNodeList = root.SelectNodes("//Products")  

 For Each chNode As XmlNode In ndl  

                Dim chObjNode As XmlNodeList = root.SelectNodes("descendant::node()[ancestor::Product[@ProductID=""1""]]")   
                For Each XNode As XmlNode In chObjNode  
                    ds.ReadXml(New XmlNodeReader(XNode))  
                Next 
            Next 
radgrid1.datasource = ds  
radgrid1.databind()

Принимая это в качестве ссылки. Было бы здорово, если бы вы могли помочь мне исправить или предложить решение этой проблемы, не переходя на XSL. Мне нужны столбцы: ItemID, ProductNo, отступ с описанием с ManufacDate и ManufacID. Я не уверен, как это отобразить.

Спасибо

1 Ответ

1 голос
/ 09 августа 2010

Я думаю, что в этом случае для вас проще всего было бы на самом деле поместить ваши XML-данные в DataSet и оттуда привязаться к RadGrid.

Я фактически взял ваш пример XML выше и использовалследующая разметка (обратите внимание, что свойство AutoGenerateHierarchy установлено в значение true только для простоты тестирования):

    <telerik:RadGrid ID="RadGrid1" runat="server" OnNeedDataSource="RadGrid1_NeedDataSource" AutoGenerateHierarchy="true">
    </telerik:RadGrid>

В выделенном коде я сделал следующее:

Protected Sub RadGrid1_NeedDataSource(ByVal sender As Object, ByVal e As GridNeedDataSourceEventArgs) Handles RadGrid1.NeedDataSource
    RadGrid1.DataSource = GetHierarchicalXmlData()
End Sub

Private XMLDataSet As DataSet
Private Function GetHierarchicalXmlData() As DataSet
    If XMLDataSet IsNot Nothing Then
        Return XMLDataSet
    End If

    XMLDataSet = New DataSet()
    Dim reader As New XmlTextReader(Server.MapPath("SampleXML.xml"))
    XMLDataSet.ReadXml(reader)


    ' in case you do not want a three-level hierarchy:
    ' this just merges the item and the description table
    ' and then removes the description table            

    XMLDataSet.Tables(1).Merge(XMLDataSet.Tables(2))
    XMLDataSet.Relations.Remove("Item_Description")
    XMLDataSet.Tables(2).Constraints.Clear()
    XMLDataSet.Tables.RemoveAt(2)

    Return XMLDataSet
End Function

Что за код вышеЭто должно быть довольно просто (хотя я не VB.NET парень;)), но он просто использует функцию ReadXML DataSet, чтобы получить XmlTextReader, который имеет ваш файл XML.

Теперь способ, которым вашXML настроен так, что он будет иерархически создавать три уровня (Product -> Item -> Description), и в случае, если вы этого не хотите, я включил некоторый пример кода, как объединить таблицы Item и Description, а затем просто удалить таблицу Description.

Это, конечно, небольшой образец, но я верю, что обо всем позаботится.

...