В XML-документе есть ошибка (2, 2) - PullRequest
1 голос
/ 29 сентября 2011

Я искал похожие вопросы и до сих пор не могу понять это.

Внутреннее исключение: {"<xml xmlns=''> was not expected."}

Я извлекаю XML из онлайн-источника, поэтому не могу внести в него изменения.http://api.ustream.tv/xml/user/techcrunch/listAllVideos?key=devkey

Я сгенерировал XSD-файл из XML с помощью Visual Studio 2010. Я использовал xsd.exe для генерации класса VB.

Вот весь мой код: Form1:

Imports System.Xml
Imports System.Data
Imports System.IO
Imports System.Xml.Serialization


Public Class Form1
Private Const strURL As String = "http://api.ustream.tv/xml/user/techcrunch/listAllVideos?key=devkey"



Private Sub btnProcess_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnProcess.Click
    Dim ds As New NewDataSet()
    Dim myReader As TextReader = New StreamReader("../../listAllVideos.xml")
    Dim serializer As New XmlSerializer(GetType(NewDataSet))
    ds = DirectCast(serializer.Deserialize(myReader), NewDataSet)
    myReader.Close()
End Sub


End Class

listAllVideos.xml: (сокращено)

<?xml version="1.0" encoding="UTF-8"?>
<xml>
<results>
<array key="0">
    <id>1916735</id>
    <title><![CDATA[The TechCrunch Office live 8/2/09 04:50PM]]></title>
    <protected>FALSE</protected>
    <description><![CDATA[8/2/09 04:50PM PST]]></description>
    <createdAt><![CDATA[2009-08-02 16:13:54]]></createdAt>
    <rating>3.000</rating>
    <lengthInSecond>2146.777</lengthInSecond>
    <totalViews>1943</totalViews>
    <codecIsForLiveHttp>0</codecIsForLiveHttp>
    <serverId>992</serverId>
    <videoName><![CDATA[1_170_1249254834012]]></videoName>
    <url><![CDATA[http://www.ustream.tv/recorded/1916735]]></url>
    <embedTag><![CDATA[<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="320" height="260" id="utv445187" name="utv_n_638715"><param name="flashvars" value="autoplay=false&vid=1916735" /><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.ustream.tv/flash/viewer.swf" /><embed flashvars="autoplay=false&vid=1916735" width="320" height="260" allowfullscreen="true" allowscriptaccess="always" id="utv445187" name="utv_n_638715" src="http://www.ustream.tv/flash/viewer.swf" type="application/x-shockwave-flash" /></object>]]></embedTag>
    <liveHttpUrl><![CDATA[]]></liveHttpUrl>
    <imageUrl>
        <small><![CDATA[http://static-cdn2.ustream.tv/videopic/0/1/1/1916/1916735/1_170_1916735_120x90_b_1:1.jpg]]></small>
        <medium><![CDATA[http://static-cdn2.ustream.tv/videopic/0/1/1/1916/1916735/1_170_1916735_320x240_b_1:1.jpg]]></medium>
    </imageUrl>
    <sourceChannel>
        <id>170</id>
        <url><![CDATA[http://www.ustream.tv/channel/170]]></url>
    </sourceChannel>
</array>
</results>
<msg><![CDATA[]]></msg>
<error><![CDATA[]]></error>
<processTime>TRUE</processTime>
<version><![CDATA[mashery-r10]]></version>
</xml>

listAllVideos.xsd:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="xml">
 <xs:complexType>
  <xs:sequence>
    <xs:element name="results">
      <xs:complexType>
        <xs:sequence>
          <xs:element name="array">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="id" type="xs:unsignedInt" />
                <xs:element name="title" type="xs:string" />
                <xs:element name="protected" type="xs:string" />
                <xs:element name="description" type="xs:string" />
                <xs:element name="createdAt" type="xs:string" />
                <xs:element name="rating" type="xs:decimal" />
                <xs:element name="lengthInSecond" type="xs:decimal" />
                <xs:element name="totalViews" type="xs:unsignedShort" />
                <xs:element name="codecIsForLiveHttp" type="xs:unsignedByte" />
                <xs:element name="serverId" type="xs:unsignedShort" />
                <xs:element name="videoName" type="xs:string" />
                <xs:element name="url" type="xs:string" />
                <xs:element name="embedTag" type="xs:string" />
                <xs:element name="liveHttpUrl" type="xs:string" />
                <xs:element name="imageUrl">
                  <xs:complexType>
                    <xs:sequence>
                      <xs:element name="small" type="xs:string" />
                      <xs:element name="medium" type="xs:string" />
                    </xs:sequence>
                  </xs:complexType>
                </xs:element>
                <xs:element name="sourceChannel">
                  <xs:complexType>
                    <xs:sequence>
                      <xs:element name="id" type="xs:unsignedByte" />
                      <xs:element name="url" type="xs:string" />
                    </xs:sequence>
                  </xs:complexType>
                </xs:element>
              </xs:sequence>
              <xs:attribute name="key" type="xs:unsignedByte" use="required" />
            </xs:complexType>
          </xs:element>
        </xs:sequence>
      </xs:complexType>
    </xs:element>
    <xs:element name="msg" type="xs:string" />
    <xs:element name="error" type="xs:string" />
    <xs:element name="processTime" type="xs:string" />
    <xs:element name="version" type="xs:string" />
  </xs:sequence>
  </xs:complexType>
 </xs:element>
</xs:schema>

Класс VB очень длинный, и он не позволит мне опубликовать его,Спасибо за ваше время.

Partial Public Class NewDataSet
Inherits Global.System.Data.DataSet

Private tablexml As xmlDataTable

Private tableresults As resultsDataTable

Private tablearray As arrayDataTable

Private tableimageUrl As imageUrlDataTable

Private tablesourceChannel As sourceChannelDataTable

Private relationxml_results As Global.System.Data.DataRelation

Private relationresults_array As Global.System.Data.DataRelation

Private relationarray_imageUrl As Global.System.Data.DataRelation

Private relationarray_sourceChannel As Global.System.Data.DataRelation

Private _schemaSerializationMode As Global.System.Data.SchemaSerializationMode = Global.System.Data.SchemaSerializationMode.IncludeSchema

Ответы [ 3 ]

1 голос
/ 19 февраля 2013

Все ваши XML-элементы правильно отформатированы.Вы можете поместить это в валидатор формата XML, такой как OygenXML или ваш любимый редактор XML, чтобы проверить это.Проблема с вашими значениями, вам нужно будет правильно кодировать специальные символы.Это список специального набора символов XML, который нельзя использовать в обычных строках XML.Это следующие символы:

1. & - &amp; 
2. < - &lt; 
3. > - &gt; 
4. " - &quot; 
5. ' - &#39; 

Вам нужно правильно отформатировать значения, чтобы выйти за пределы этой ошибки.Я предлагаю использовать циклический просмотр значений и использовать System.Security.SecurityElement.Escape (stringValue); для кодирования значений.

0 голосов
/ 03 октября 2011

Проблема в том, что ваш класс NewDataSet будет соответствовать XML, начинающемуся с <NewDataSet>, но вы передаете XML, который начинается с <xml>.Вот почему это неожиданно.

Либо оберните XML с помощью <NewDataSet></NewDataSet>, либо сгенерируйте ваши классы с помощью команды xsd /c, которая будет генерировать только "простые" классы, а не набор данных.

0 голосов
/ 29 сентября 2011

Я не думаю, что элемент xml может иметь имя "xml", не так ли?

http://www.w3.org/TR/xml/#sec-common-syn

[Определение: имя - это Nmtoken с ограниченным доступомнабор начальных символов.] Запрещенные начальные символы для Имен включают цифры, диакритические знаки, точку остановки и дефис.

Имена, начинающиеся со строки «xml» или любой строки, которая будет соответствовать (('X'| 'x') ('M' | 'm') ('L' | 'l')), зарезервированы для стандартизации в этой или будущих версиях этой спецификации.

...