Мой linq-запрос не работает при добавлении атрибута xmlns к корневому элементу в моем XML-документе - PullRequest
1 голос
/ 27 апреля 2009

Я пытаюсь получить больше информации о LINQ-to-XML, поэтому я сделал себе небольшой пример XML-документа, чтобы опробовать его. Кроме того, я попытался (и успешно) создал собственную XML-схему для этого файла, просто чтобы проверить это. XML-документ довольно прост и выглядит примерно так:

<cars xmlns="/carsSchema.xsd">
  <car age="5">
    <carId>1</carId>
    <brand>BMW</brand>
    <model>320i</model>
    <color paintType="metallic">Red</color>
  </car>

  <car age="2">
    <carId>2</carId>
    <brand>VW</brand>
    <model>Golf</model>
    <color paintType="matt">White</color>
  </car>
[...]
</cars>

Теперь запрос этого документа работает нормально, если я удаляю атрибут xmlns из корневого элемента. Когда я добавляю его обратно, запрос возвращает ноль и ничего. Я пытался выяснить это самостоятельно, но мне еще не удалось найти решение, которое решило бы мою проблему.

Вот C # -бит:

        XDocument xmlDoc = XDocument.Load(currentDir + "\\Cars.xml");

// XNamespace ns = "{" + currentDir + "\\carSchema.xsd}";
// Tried to query xmlDoc.Descendants(ns+"car") after reading another post, 
// but that  made no difference

        var carInfo1 = from car in xmlDoc.Descendants("car")
                       select (string)car.Element("brand") + ": " + (string)car.Element("model");

Кто-нибудь видит, что не так? И почему LINQ действительно должно заботиться , что так много о пространстве имен? Разве он не может просто запросить мой файл и не заботиться об этом?

Заранее спасибо! : -)

Ответы [ 2 ]

3 голосов
/ 27 апреля 2009

При поиске по потомкам и элементам вам необходимо указать пространство имен. Это довольно легко с LINQ to XML. Похоже, вы были почти там, но не делали этого для элементов:

XDocument xmlDoc = XDocument.Load(currentDir + "\\Cars.xml");
// I don't think namespace URIs are really resolved. I'm not sure though -
// for a proof of concept, I suggest you use a namespace of
// http://dummy.com/dummy.xsd
XNamespace ns = "/carSchema.xsd";

var carInfo1 = from car in xmlDoc.Descendants(ns + "car")
                   select (string)car.Element(ns + "brand") + ": " + 
                          (string)car.Element(ns + "model");
1 голос
/ 28 мая 2009

Это также работает, когда вы используете фиктивный "http://" URI в качестве пространства имен. Вы правы. Он не разрешен.

        private XNamespace ns = "http://schemas.xin2009.com/DataMap/2009";

                IEnumerable<string> names = (from spnode in _map.Descendants(ns + "Entity")
                                         where spnode.Attribute("name").Value == this.Entity
                                         select spnode.Element(ns + "StoredProcedure").Attribute("name").Value);

Обратите внимание, что ns для пространства имен нужно было добавлять только в элементы, а не в атрибуты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...