LINQ to XML: последовательность не содержит элементов

#vb.net #linq-to-xml

#vb.net #linq-to-xml

Вопрос:

У меня есть этот XML

    <?xml version="1.0" encoding="utf-8"?>
    <root>
        <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
        <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
        <xsd:element name="root" msdata:IsDataSet="true">
      <xsd:complexType>
        <xsd:choice maxOccurs="unbounded">
          <xsd:element name="metadata">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" />
              </xsd:sequence>
              <xsd:attribute name="name" use="required" type="xsd:string" />
              <xsd:attribute name="type" type="xsd:string" />
              <xsd:attribute name="mimetype" type="xsd:string" />
              <xsd:attribute ref="xml:space" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="assembly">
            <xsd:complexType>
              <xsd:attribute name="alias" type="xsd:string" />
              <xsd:attribute name="name" type="xsd:string" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="data">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
              </xsd:sequence>
              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
              <xsd:attribute ref="xml:space" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="resheader">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
              </xsd:sequence>
              <xsd:attribute name="name" type="xsd:string" use="required" />
            </xsd:complexType>
          </xsd:element>
        </xsd:choice>
      </xsd:complexType>
    </xsd:element>
   </xsd:schema>
  <resheader name="resmimetype">
    <value>text/microsoft-resx</value>
  </resheader>
  <resheader name="version">
    <value>2.0</value>
  </resheader>
  <resheader name="reader">
    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  </resheader>
  <resheader name="writer">
    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  </resheader>
  <data name="Nieuws" xml:space="preserve">
    <value>News</value>
  </data>
  <data name="Pagina's" xml:space="preserve">
    <value>Pages</value>
  </data>
  <data name="searchreasults" xml:space="preserve">
    <value>There were no matches found</value>
  </data>
</root>
  

И у меня также есть этот метод, где я беру два файла и извлекаю из них некоторые значения, а затем объединяю все значения в объект во втором запросе:

 Public Shared Function RetrieveTranslation(ByVal filefrom As String, ByVal fileto As String) As List(Of clsTranslation)
    Dim valuefrom = (From l In XElement.Load(fileto).Elements("data") Select l.Element("value").Value).FirstOrDefault

    Dim valuetrans = From vl In XElement.Load(filefrom).Elements("data") Select (New clsTranslation With {.Filename = filefrom, .Value = vl.Element("value").Value, .Valueto = valuefrom.ToString, .TranslationId = vl.Attribute("name").Value})
    Return valuetrans.ToList

End Function
  

Итак, проблема в том, что когда я запускаю код, в первом запросе (valuefrom) появляется ошибка «Последовательность не содержит элементов». Я отлаживал, и он говорит, что в запросе ничего нет, но я не понимаю почему, потому что я делал похожие вещи и никогда не сталкивался с подобной проблемой.

Есть какие-нибудь подсказки?

Заранее спасибо,

Alf.

P.S: О! И, кстати, мне любопытно узнать, хорошо ли сделать что-то вроде того, что сделал я, создать объект из двух запросов, поместив первое значение во второй запрос. Спасибо!

Комментарии:

1. Ну, вы опубликовали небольшой фрагмент разметки, который даже не является правильно сформированным XML-документом. Я подозреваю, что проблема связана с пространствами имен, объявленными в частях документа, которые вы не показали. Либо покажите нам какие-либо объявления пространства имен в элементах-предках этих элементов «data», либо попробуйте выяснить это самостоятельно с помощью msdn.microsoft.com/en-us/library/bb387093.aspx .

2. хммм… Я проверю страницу. Я также обновляю весь XML-документ, хотя часть, которую я опубликовал, является наиболее важной

3. Я не могу воспроизвести проблему с вашим образцом XML, я сохранил ваш полный образец XML как «XMLFile1.xml «а затем просто выполнил две строки кода Dim valuefrom = (From l In XElement.Load("....XMLFile1.xml").Elements("data") Select l.Element("value").Value).FirstOrDefault и Console.WriteLine(valuefrom) , и я не получаю никакой ошибки, скорее выводятся «Новости». Итак, каким-то образом ваш фактический код, выдающий эту ошибку, должен отличаться.

4. Да, на самом деле я получаю эту ошибку, используя First вместо FirstOrDefault. Но, используя последний, я получаю другую ошибку. «Ссылка на объект не установлена на экземпляр объекта»…. Кажется, он не может создать объект, но почему?

5. Кажется, что значение равно null, но на самом деле вы могли бы принять значение с помощью консоли. Строка записи (valuefrom)… это то, чего я не понимаю…

Ответ №1:

РЕШЕНО! Моя проблема была не с кодом, а с другими XML-файлами, которые были пустыми… Спасибо за помощь!