2010-05-27 3 views
2

Я использую LINQ to XML для создания фрагмента XML. Все отлично работает, за исключением того, что я каким-то образом бросаю какие-то пустые объявления пространства имен. Кто-нибудь знает, что я делаю неправильно? Вот мой кодПочему я получаю дополнительные xmlns = "" используя LINQ to 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> 

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

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

ответ

2

Из-за недостающего пространства имен в:

new XElement("StationInventory"... 

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

new XElement(ns + "StationInventory"... 

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

Смежные вопросы