2009-10-16 2 views
0

Приветствую вас, надеюсь, что все это хорошо. У меня проблема при чтении xml-файла в vb.net, то есть сообщение об ошибке "Data at the root level is invalid. Line 860, position 18.". Мой xml-файл с ошибкой при чтении выглядит следующим образом.Ошибка при чтении xml-файла

Фактически я сохраняю этот файл, используя следующий код в vb.net от 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. найти решение для меня. Заранее спасибо.

+0

@pravakar, как вы можете придерживаться своих предыдущих сообщений? http://stackoverflow.com/questions/1576534/how-to-read-xml-data-from-a-url-by-using-vb-net-and-save/1576729#1576729 –

ответ

1

Вы можете попробовать следующий сокращенный вариант для загрузки файла:

Using client As New System.Net.WebClient 
    client.DownloadFile("http://xyz", "c:/GetXml.xml") 
End Using 
+0

см. это: http://stackoverflow.com/questions/1576534/how-to-read-xml-data-from-a-url-by-using-vb-net-and-save/1576729#1576729 –

0

Является ли ваш файл XML ровно 100 000 байтов после того, как вы его выписали? Если это так, вероятно, проблема - ваш код будет работать только с файлами длиной до 100 000 байт. Вместо того, чтобы использовать один большой буфер, было бы лучше многократно читать из ответа и записывать в файл, пока не будет больше данных. Вот C# метод для копирования потоков - я преобразовать его в VB в минуту:

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); 
    } 
} 

Если это не проблема, вы загрузили файл в текстовом редакторе и взглянули на линии 860, позиция 18?

1

Ваш код имеет некоторые недостатки:

  1. это ограничивает длину файла 100000 байт (если он больше вы закончите с сломанным xml)
  2. исключение безопасности, некоторые ручки не закрыты в случае исключений, если вы заходите в эту процедуру во второй раз после исключения, XML может быть заблокирован (в зависимости от того, будет ли GC располагаются стрелы Я уже или нет)

Я бы переписать петлю таким образом:

  • Получить Webstream
  • Открыть файл -> FileStream
  • Запись в этот файл кусочно
  • Закрыть файл & stream
Смежные вопросы