Проблема LINQ to XML из-за пространства имен xml

#xml #linq #linq-to-xml

#xml #linq #linq-to-xml

Вопрос:

Я пытаюсь использовать Linq для выбора из XML. Вот пример XML:

 <?xml version="1.0" encoding="UTF-8"?>
<listingexport xmlns="http://websitexmlfeed.com/webservice/2/listings"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://websitexmlfeed.com/webservice/2/listings ../listings.xsd">
<listing>
    <id>00001</id>
    <name>Modelname</name>
    <type>Typename</type>
</listing>
</listingexport>
  

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

 XDocument le = XDocument.Load(@uri);
var listings = (from listing in le.Descendants("listing")
                       select new listingType
                       {
                           Id = listing.Element("id").Value,
                           Name= listing.Element("name").Value,
                           Type= listing.Element("type").Value
                        }).ToList();
  

Проблема, с которой я сталкиваюсь, заключается в том, что файл.Вызов Descendants («listing») не возвращает никаких результатов из XML-файла из-за информации о пространстве имен (я предполагаю, что проблема связана с этим сообщением: ASP.NET XPath 2.0 XmlDataSource не поддерживает пространства имен). Однако, если я изменю файл XML, чтобы не было информации о пространстве имен как таковой:

 <?xml version="1.0" encoding="UTF-8"?>
  <listingexport>
   <listing>
    <id>00001</id>
    <name>Modelname</name>
    <type>Typename</type>
   </listing>
  </listingexport>
  

это работает. К сожалению, у меня нет доступа для изменения файла xml, поэтому мне нужно решение, которое будет работать. Любая помощь приветствуется.

спасибо, Джо

Ответ №1:

Включить

 XNamespace ns  = "http://websitexmlfeed.com/webservice/2/listings";
  

и попробуйте

 var listings = (from listing in le.Descendants(ns   "listing")
                       select new 
                       {
                           Id = listing.Element(ns   "id").Value,
                           Name= listing.Element(ns   "name").Value,
                           Type= listing.Element(ns   "type").Value
                        }).ToList();