Зацикливание XML с элементом с помощью xmlReader

   Dim client As New WebClient()
   Dim xmlString As String = client.DownloadString("http://api.rovicorp.com/TVlistings/v9/listings/gridschedule/80000/info?locale=en-US&duration=220&includechannelimages=1&format=xml&apikey=" & api_TV)
   Dim counter As Integer = 0

Using reader As XmlReader = XmlReader.Create(New StringReader(xmlString))
    Dim tvListings As XDocument = XDocument.Parse(xmlString)

    For Each blah As XElement In tvListings.Root.Elements
        counter += 1
    Next

    Debug.Print(counter)
End Using

И я получаю только счетчик из 8, что должно быть около 100+.

XML выглядит следующим образом:

<GetGridScheduleResult xmlns="http://api.rovicorp.com/v9/listings" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Locale="en-US" ServiceId="5122" Name="Cityhere - Comcast" StartDate="2013-04-12T14:18:24.2054325Z" Duration="240">
<GridChannels>
  <GridChannel ServiceId="890138" SourceId="1280" Order="20002" Channel="2" CallLetters="WGNAMER" DisplayName="WGNAMER" SourceLongName="WGN America" Type="24-Hours" SourceType="Basic" ParentNetworkId="0" IconAvailable="false" IsChannelOverride="false" SourceAttributes="0">
    <ChannelSchedules/>
    <SourceAttributeTypes/>
    <Airings>
        <GridAiring ProgramId="35951" SeriesId="3490" Title="Matlock" EpisodeTitle="Santa Claus" AiringTime="2013-04-12T14:00:00Z" Duration="60" Color="Color" AiringType="Unknown" CC="true" LetterBox="false" Stereo="false" HD="false" SAP="false" TVRating="TV-PG" Dolby="false" DSS="false" HDLevel="HD Level Unknown" DVS="false" Category="Other" Subcategory="drama" Sports="false"/>
        <GridAiring ProgramId="828869" SeriesId="1409" Title="In the Heat of the Night" EpisodeTitle="Hatton's Turn" AiringTime="2013-04-12T15:00:00Z" Duration="60" Color="Color" AiringType="Unknown" CC="true" LetterBox="false" Stereo="false" HD="false" SAP="false" TVRating="TV-PG@V" Dolby="false" DSS="false" HDLevel="HD Level Unknown" DVS="false" Category="Other" Subcategory="crime drama" Sports="false"/>
        <GridAiring ProgramId="978338" SeriesId="1409" Title="In the Heat of the Night" EpisodeTitle="Hatton's Turn" AiringTime="2013-04-12T16:00:00Z" Duration="60" Color="Color" AiringType="Unknown" CC="true" LetterBox="false" Stereo="false" HD="false" SAP="false" TVRating="TV-PG@V" Dolby="false" DSS="false" HDLevel="HD Level Unknown" DVS="false" Category="Other" Subcategory="crime drama" Sports="false"/>
        <GridAiring ProgramId="4210626" Title="WGN Midday News" AiringTime="2013-04-12T17:00:00Z" Duration="60" Color="Color" AiringType="New" CC="true" LetterBox="false" Stereo="true" HD="false" SAP="false" TVRating="None" Dolby="false" DSS="false" HDLevel="HD Level Unknown" DVS="false" Category="News" Subcategory="newscast" Sports="false"/>
        <GridAiring ProgramId="878716" SeriesId="1028666" Title="Walker, Texas Ranger" EpisodeTitle="El Coyote, Part 2" AiringTime="2013-04-12T18:00:00Z" Duration="60" Color="Color" AiringType="Unknown" CC="true" LetterBox="false" Stereo="true" HD="false" SAP="false" TVRating="TV-14@V" Dolby="false" DSS="false" HDLevel="HD Level Unknown" DVS="false" Category="Other" Subcategory="crime drama" Sports="false"/>
    </Airings>
    <ChannelImages>
        <ImageGrid ImageUrl="http://cps-static.rovicorp.com/2/Open/TV%20Guide%20Widget%20Logos/WGN_2010.png" ImageId="427700" ImageTitle="WGN America" ImageCaption="Widget Logo" ObjectId="1280" ObjectName="WGN America" ImageCreditDisplay="false" ImageType="Station Logo" ImageHorizontalResolution="92" ImageVerticalResolution="36" ImageFormatId="0" AspectRatio="5:2" ParentImageId="16818227">
            <ObjectType>Source</ObjectType>
            <ImageFormat xsi:nil="true"/>
            <ImageExpiryDateTime xsi:nil="true"/>
            <LastUpdate>2012-01-24T15:20:46.453Z</LastUpdate>
        </ImageGrid>
    </ChannelImages>
  </GridChannel>
  etc etc...
</GridChannels>
</GetGridScheduleResult>

person StealthRT    schedule 12.04.2013    source источник
comment
Вы уверены, что в вашем документе более 8 элементов <GridChannels>? Помните, что метод Elements() возвращает только прямой дочерний элемент текущего элемента, поэтому вы подсчитываете количество элементов, которые являются прямыми дочерними элементами элемента Root, который равен GetGridScheduleResult в вашем XML.   -  person MarcinJuraszek    schedule 13.04.2013
comment
Откуда волшебным образом появился xmlstring?   -  person Tony Hopkinson    schedule 13.04.2013
comment
@TonyHopkinson обновил OP, чтобы показать это.   -  person StealthRT    schedule 13.04.2013
comment
@MarcinJuraszek позитивный. Это список телепередач, в котором более 300 каналов.   -  person StealthRT    schedule 13.04.2013
comment
Возможно, вы могли бы Debug.Print() 8 узлов, которые вы успешно подсчитали, чтобы получить больше информации о симптомах.   -  person David Tansey    schedule 13.04.2013
comment
Установите точку останова внутри цикла и проверьте переменную blah. VS имеет XML-представление для вашего удобства. Кстати, вам не нужно XmlReader здесь.   -  person Neolisk    schedule 13.04.2013
comment
Можете ли вы уточнить, какой результат, по вашему мнению, лучше поможет вам достичь этого? Вы считаете GrindChannels?   -  person Lotok    schedule 13.04.2013
comment
Избавьтесь от XmlReader, который вы не используете   -  person Tony Hopkinson    schedule 13.04.2013
comment
@TonyHopkinson Я использую xmlReader в разделе Использование. Я использую XmlReader только для того, чтобы посмотреть, сколько раз нужно выполнить цикл.   -  person StealthRT    schedule 15.04.2013
comment
@StealthRT, Xdocumemt.parse даст вам это, и, учитывая, что он в любом случае использует весь документ, использование XmlReader бессмысленно.   -  person Tony Hopkinson    schedule 15.04.2013
comment
@TonyHopkinson, несмотря на это, я все еще не могу заставить его перебрать все элементы.   -  person StealthRT    schedule 16.04.2013
comment
Вы так и не сказали, что подразумеваете под всеми элементами. Если вы имеете в виду каждый xmlNode, несмотря на вложенность, это не то, как работает xml, и вы делаете что-то неправильно.   -  person Tony Hopkinson    schedule 16.04.2013
comment
@TonyHopkinson Имеется в виду каждое мгновение GridChannel, в котором хранится информация о каждом канале. Должно быть больше 100.   -  person StealthRT    schedule 16.04.2013


Ответы (3)


Если вам просто нужно подсчитать <GridChannel> элементов, все, что вам нужно, это небольшой оператор LINQ.

c#

XDocument document = XDocument.Parse(XmlString);
var count = document.Descendants("GridChannel").Count();

ВБ.Нет

Dim document as XDocument = XDocument.Parse(XmlString)
Dim count = document.Descendants("GridChannel").Count()
person Lotok    schedule 12.04.2013
comment
Он говорит, что счет равен 0. Dim count = blah.Descendants(GridChannel).Count() - person StealthRT; 15.04.2013
comment
Может ли это быть связано с тем, что GridChannel настроен не так, как этот ‹GridChannel› и его ‹GridChannel ServiceId=890138 SourceId=1280 Order=20002 Channel=2 CallLetters=WGNAMER DisplayName=WGNAMER SourceLongName=WGN America Type=24-Hours SourceType=Basic ParentNetworkId=0 IconAvailable=false IsChannelOverride=false SourceAttributes=0› - person StealthRT; 15.04.2013
comment
Никакие атрибуты и дочерние элементы не должны иметь значения. Ваш XML идентичен приведенному выше, включая регистр? Я проверил вышеперечисленное и получил результаты. Если вы загружаете из файла, а не из строковой переменной, используйте XDocument.Load(pathtofile) - person Lotok; 15.04.2013
comment
Я все еще придумываю 0 для подсчета. Dim tvListings As XDocument = XDocument.Load(c:\temp\xml.xml) Dim count = tvListings.Descendants(GridChannel).Count() - person StealthRT; 16.04.2013
comment
Правильно ли сформирован ваш xml? Включая декларацию XML вверху? - person Lotok; 16.04.2013

Попробуйте это тогда

Dim doc as XmlDocument =  new XmlDocument();
doc.LoadXml(xmlString)
XmlNode channelsNode = doc.documentElement.SelectSingleNode("GridChannels")
foreach XmlNode gridChannelNode in channelsNode.SelectNodes("GridChannel"))
///
Next

Учитывая то, что вы опубликовали, это должно быть связано только с переходом к узлу GridChannels, а затем с циклом через его дочерние элементы GridChannel.

Простите за отсутствие VBNess, я C# мальчик

person Tony Hopkinson    schedule 16.04.2013
comment
Значит, ты нам что-то недоговариваешь. Когда вы отлаживаете, что показывает channelsNode.OuterXml? - person Tony Hopkinson; 16.04.2013

Получил это, сделав это:

    Dim jsonObject As RootObject = JsonConvert.DeserializeObject(Of RootObject)(s)

    For Each post In jsonObject.GridScheduleResult.GridChannels
        Dim Channel As String = post.Channel
        Dim DisplayName As String = post.DisplayName

        If post.ChannelImages.Count <> 0 Then
            Dim ImageUrl As String = post.ChannelImages.Item(0).ToString
            Dim tmpL As Integer = InStr(ImageUrl, ":")
            Dim tmpR As Integer = InStr(ImageUrl, ",")
        End If

        While counter < post.Airings.Count
            Dim Title As String = post.Airings.Item(counter).Title
            Dim EpisodeTitle As String = post.Airings.Item(counter).EpisodeTitle
        End While

        theTime = 0
        counter = 0
    Next
person StealthRT    schedule 17.04.2013