views:

222

answers:

3

Hi friends hope all r doing well. I have a problem while reading xml file in vb.net i.e. giving error message "Data at the root level is invalid. Line 860, position 18." My xml file with error while reading is as follows.

Actually i am saving this file using following code in vb.net from httpwebresponse.

    Try
    Dim strUrl As String = "http://xyz"
    Dim wr As HttpWebRequest = CType(WebRequest.Create(strUrl), HttpWebRequest)
    Dim ws As HttpWebResponse = CType(wr.GetResponse(), HttpWebResponse)
    ws.ContentType = "UTF-8"
    Dim str As Stream = ws.GetResponseStream()
    Dim inBuf(100000) As Byte
    Dim bytesToRead As Integer = CInt(inBuf.Length)
    Dim bytesRead As Integer = 0
    While bytesToRead > 0
        Dim n As Integer = str.Read(inBuf, bytesRead, bytesToRead)
        If n = 0 Then
            Exit While
        End If
        bytesRead += n
        bytesToRead -= n
    End While
    Dim fstr As New FileStream("c:/GetXml.xml", FileMode.OpenOrCreate, FileAccess.Write)
    fstr.Write(inBuf, 0, bytesRead)
    str.Close()
    fstr.Close()
Catch ex As WebException
    Response.Write(ex.Message)
End Try


 <?xml version="1.0" encoding="UTF-8" ?> 
- <Result>
- <Jobs Found="58" Returned="50">
- <Job ID="8000009">
  <Title>Water Infrastucture Professionals</Title> 
- <Summary>
- <![CDATA[ Great Potential for Career Growth Rewardidng Salary package Great Potential for Career Growth Rewardidng Salary package Our client is major utilities entity who is searching for tradespeople with water, sewage, stormwater and related infrastructure network experience. This is an exciting role with excellent career benefits and an opportunity to utilise your extensive experience in field operations
  ]]> 
  </Summary>
  <DateActive Date="2009-10-14T11:26:28-05:00">10/14/2009</DateActive> 
  <DateExpires Date="2009-11-13T21:33:33-05:00">11/13/2009</DateExpires> 
  <DateUpdated Date="2009-10-14 21:34:00">10/14/2009</DateUpdated> 
- <Location>
  <Country>xxx</Country> 
  <State>xxx</State> 
  <City>xxx</City> 
  <PostalCode>00000000</PostalCode> 
  </Location>
  <CompanyName>Hudson</CompanyName> 
  <BuilderFields /> 
  <DisplayOptions /> 
  <AddressType>6</AddressType> 
  </Job>
- <Job ID="83678951" PositionID="61132478">
  <Title>SENIOR CIVIL ENGINEER - ROADS AND HIGHWAYS</Title> 
- <Summary>
- <![CDATA[ ARE YOU A CIVIL ENGINEER? THIS IS A RARE AND EXCITING OPPORTUNITY TO PROGRESS YOUR CAREER WITH A WELL ESTABLISHED AND GROWING COMPANY!!! ACT LOCATION EXCELLENT REMUNERATION MULTIPLE PROJECTS Our client is one of the worlds leading engineering consultancies with over forty year&#39;s experience across a wide range of disciplines. With an expanding project portfolio they are now seeking to employ an expe
  ]]> 
  </Summary>
  <DateActive Date="2009-09-29T18:02:30-05:00">9/29/2009</DateActive> 
  <DateExpires Date="2009-10-29T23:36:33-05:00">10/29/2009</DateExpires> 
  <DateUpdated Date="2009-09-29 23:37:00">9/29/2009</DateUpdated> 
- <Location>
  <Country>Australia</Country> 
  <State>ACT</State> 
  <City>CANBERRA</City> 
  <PostalCode>2600</PostalCode> 
  </Location>
  <CompanyName>Gemteq</CompanyName> 
  <BuilderFields /> 
  <DisplayOptions /> 
  <AddressType>6</AddressType> 
  </Job>
- <Job ID="83679392" PositionID="61132870">
  <Title>Principal Mechanical Engineer</Title> 
- <Summary>
- <![CDATA[ Canberra based Permanent Role Attractive salary package High Profile Organisation Our client is currently seeking a Principal&#39;s Mechanical Engineer to lead their team of professional mechanical services design engineers. Responsibilities You will be leading a team of engineers to: Develop technical and professional excellence. Use environmentally sustainable design practices. Manage a variety of pro
  ]]> 
  </Summary>
  <DateActive Date="2009-09-29T17:57:34-05:00">9/29/2009</DateActive> 
  <DateExpires Date="2009-10-30T00:44:30-05:00">10/30/2009</DateExpires> 
  <DateUpdated Date="2009-09-30 00:45:00">9/30/2009</DateUpdated> 
- <Location>
  <Country>Australia</Country> 
  <State>ACT</State> 
  <City>Canberra</City> 
  <PostalCode>2600</PostalCode&gThe XML page cannot be displayed 
Cannot view XML input using XSL style sheet. Please correct the error and then click the Refresh button, or try again later. 


--------------------------------------------------------------------------------

Invalid at the top level of the document. Error processing resource 'file:///Z:/d8fb0c80-e45c-4207-97b0-47e4d6c314ad.xml'. ...

</Jobs></Result>>

t; 
  </Location>
  <CompanyName>Human Touch Resource Group</CompanyName> 
- <Salary>
  <Max Value="30000">30,000.00</Max>

Pls. find a solution for me. Thanks in advance.

A: 

Is your XML file exactly 100,000 bytes long after you've written it out? If so, that's probably the problem - your code will currently only work with files up to 100,000 bytes long. Instead of using one big buffer, it would be better to repeatedly read from the response and write to the file, until there's no more data. Here's a C# method to copy streams - I'll convert it to VB in a minute:

public static void CopyStream(Stream input, Stream output)
{
    byte[] buffer = new byte[8192];
    int bytesRead;
    while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0)
    {
        output.Write(buffer, 0, bytesRead);
    }
}

If that's not the problem, have you loaded the file up in a text editor and had a look at line 860, position 18?

Jon Skeet
+1  A: 

You may try the following shorter version to download your file:

Using client As New System.Net.WebClient
    client.DownloadFile("http://xyz", "c:/GetXml.xml")
End Using
Darin Dimitrov
see this: http://stackoverflow.com/questions/1576534/how-to-read-xml-data-from-a-url-by-using-vb-net-and-save/1576729#1576729
Rubens Farias
+1  A: 

Your code has some flaws:

  1. it is limiting the length of the file to 100000 bytes (if it's longer you'll end up with a broken xml)
  2. exception safety, some handles are not closed in case of exceptions, if you come into this routine a second time after an exception, the XML might be locked (depending on if the GC disposed the stream already or not)

I would rewrite the loop this way:

  • Get the webstream
  • Open a file -> filestream
  • Write to this file piecewise
  • Close the file & stream
jdehaan