Почему я получаю дополнительные xmlns = "", используя LINQ to XML? - PullRequest
2 голосов
/ 27 мая 2010

Я использую LINQ to XML для генерации фрагмента XML. Все отлично работает, за исключением того, что я как-то добавляю пустые объявления пространства имен. Кто-нибудь там знает, что я делаю неправильно? Вот мой код

    private string SerializeInventory(IEnumerable<InventoryInformation> inventory)
    {
        var zones = inventory.Select(c => new {
            c.ZoneId
            , c.ZoneName
            , c.Direction
        }).Distinct();

        XNamespace ns = "http://www.dummy-tmdd-address";
        XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance";

        var xml = new XElement(ns + "InventoryList"
                               , new XAttribute(XNamespace.Xmlns + "xsi", xsi)
                               , zones.Select(station => new XElement("StationInventory"
                               , new XElement("station-id", station.ZoneId)
                               , new XElement("station-name", station.ZoneName)
                               , new XElement("station-travel-direction", station.Direction)
                               , new XElement("detector-list"
                               , inventory.Where(p => p.ZoneId == station.ZoneId).Select(plaza =>
                               new XElement("detector", new XElement("detector-id", plaza.PlazaId)))))));

        xml.Save(@"c:\tmpXml\myXmlDoc.xml");
        return xml.ToString();
    }

А вот и полученный xml. Я надеюсь, что это делает правильно? Браузер может скрывать теги.

<InventoryList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.dummy-tmdd-address">
<StationInventory xmlns="">
  <station-id>999</station-id> 
  <station-name>Zone 999-SEB</station-name> 
  <station-travel-direction>SEB</station-travel-direction> 
 <detector-list>
<detector>
  <detector-id>7503</detector-id> 
 </detector>
<detector>
  <detector-id>2705</detector-id> 
 </detector>
</detector-list>
</StationInventory>
</InventoryList>

Обратите внимание на объявление пустого пространства имен в первом дочернем элементе. Любые идеи, как я могу исправить это? Любые советы, конечно, приветствуются.

Спасибо всем.

1 Ответ

2 голосов
/ 27 мая 2010

Из-за отсутствия пространства имен в:

new XElement("StationInventory"... 

Это неявно указывает на пустое пространство имен "" для элемента StationInvetory. Вы должны сделать:

new XElement(ns + "StationInventory"...

Обратите внимание, что вы должны сделать это для любого создаваемого вами элемента, который находится в пространстве имен ns. Сериализатор XML обеспечит соответствие элементов правильному префиксу пространства имен в соответствии с областью действия.

...