读取xml文件时出错

时间:2009-10-16 06:08:54

标签: xml vb.net stream

嗨朋友们希望所有人都做得好。我在vb.net中读取xml文件时遇到问题,即在阅读时给出错误消息"Data at the root level is invalid. Line 860, position 18."我的xml文件有错误,如下所示。

实际上我使用httpwebresponse中的vb.net中的以下代码保存此文件。

    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。为我找到一个解决方案。提前谢谢。

3 个答案:

答案 0 :(得分:1)

您可以尝试使用以下较短版本来下载文件:

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

答案 1 :(得分:1)

您的代码存在一些缺陷:

  1. 它将文件的长度限制为100000字节(如果它更长,你最终会破坏xml)
  2. 异常安全,一些句柄在异常情况下不会关闭,如果你在异常后第二次进入这个例程,XML可能会被锁定(取决于GC是否已经处理了流)
  3. 我会用这种方式重写循环:

    • 获取网络流
    • 打开文件 - &gt; FILESTREAM
    • 分段写入此文件
    • 关闭文件&amp;流

答案 2 :(得分: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位?