2013-11-16 3 views
0

Построение XML XDocument, чтобы подтолкнуть к веб-службы и нуждается в корневой элемент значения пространства имен это то, что форма XML должна выглядеть ....XML пространство имен не форматирование Правильно

<shipment-feed xmlns="http://seller.marketplace.sears.com/oms/v5" 

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://seller.marketplace.sears.com/oms/v5 asn.xsd "> 
<shipment> 
<header> 
<asn-number>00601780002</asn-number> 
<po-number>0060180</po-number> 
<po-date>2009-09-26</po-date> 
</header> 
<detail> 
<tracking-number>UPS1XXX</tracking-number> 
<ship-date>2001-01-01</ship-date> 
<shipping-carrier>UPS</shipping-carrier> 
<shipping-method>GROUND</shipping-method> 
<package-detail> 
<line-number>1</line-number> 
<item-id>AB12345678912345456789123456789CD</item-id> 
<quantity>1</quantity> 
</package-detail> 
</detail> 
</shipment> 
</shipment-feed> 

Это XML, что Я получаю ....

<?xml version="1.0" encoding="utf-8"?> 
<shipment-feed xmlns="http://seller.marketplace.sears.com/oms/v5" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsischemalocation="http://seller.marketplace.sears.com/oms/v5 asn.xsd"> 
    <shipment xmlns=""> 
    <header> 
     <asn-number>2824565201311</asn-number> 
     <po-number>2824565</po-number> 
     <po-date>2013-11-14</po-date> 
    </header> 
    <details> 
     <tracking-number>579040914892</tracking-number> 
     <ship-date>2013-11-14</ship-date> 
     <shipping-carrier>FEDEX</shipping-carrier> 
     <shipping-method>Ground</shipping-method> 
     <package-details> 
     <line-number>1</line-number> 
     <item-id>LTH7XB1MW-EA</item-id> 
     <quantity>3</quantity> 
     </package-details> 
    </details> 
    </shipment> 
    <shipment xmlns=""> 
    <header> 
     <asn-number>2821596201311</asn-number> 
     <po-number>2821596</po-number> 
     <po-date>2013-11-13</po-date> 
    </header> 
    <details> 
     <tracking-number>9405515901119923380663</tracking-number> 
     <ship-date>2013-11-14</ship-date> 
     <shipping-carrier>USPS</shipping-carrier> 
     <shipping-method>Priority Mail</shipping-method> 
     <package-details> 
     <line-number>1</line-number> 
     <item-id>CWD93151-EA</item-id> 
     <quantity>6</quantity> 
     </package-details> 
     <package-details> 
     <line-number>2</line-number> 
     <item-id>CWD93901-EA</item-id> 
     <quantity>4</quantity> 
     </package-details> 
    </details> 
    </shipment> 
</shipment-feed> 

Это C# код, который я создал ....

XNamespace ns1 = "http://seller.marketplace.sears.com/oms/v5"; 
XNamespace ns2 = "http://www.w3.org/2001/XMLSchema-instance"; 
XNamespace ns3 = "http://seller.marketplace.sears.com/oms/v5 asn.xsd"; 
XDocument doc = new XDocument();  
XElement root = new XElement(ns1 + "shipment-feed", 
          new XAttribute("xmlns" , "http://seller.marketplace.sears.com/oms/v5"), 
          new XAttribute(XNamespace.Xmlns + "xsi", "http://www.w3.org/2001/XMLSchema-instance"), 
          new XAttribute("xsi" + "schemalocation", "http://seller.marketplace.sears.com/oms/v5 asn.xsd")); 


doc.Add(root); 
int x = 1; 
foreach (SearsOrder s in SearsList) 
{ 
    XElement shipment = new XElement("shipment",     
         new XElement("header", 
          new XElement("asn-number", s.asnnumber), 
          new XElement("po-number", s.ponumber), 
          new XElement("po-date", s.podate)), 
         new XElement("details", 
          new XElement("tracking-number", s.trackingnum), 
          new XElement("ship-date", s.shipdate), 
          new XElement("shipping-carrier", s.carrier), 
          new XElement("shipping-method", s.method), 
          s.orderitems.Select(i => new XElement("package-details", 
            new XElement("line-number", x++), 
            new XElement("item-id", i.itemid), 
            new XElement("quantity", i.quantity)))        
      )); 

    doc.Root.Add(shipment); 
    x = 1; 
} 

кулак проблема я s первый дочерний узел я не вижу, откуда это происходит, потому что этот узел даже не объявлен до цикла foreach. У меня создалось впечатление, что я добавляю атрибуты к корневому элементу.

и другая проблема удаления декларации XML

ответ

2

Такого рода вещи проблема:

new XElement("shipment", ...) 

Вы хотите, чтобы shipment элементы, чтобы быть в "http://seller.marketplace.sears.com/oms/v5" пространстве имен - так что вам нужно сделать это явное. Это не будет отображаться в полученном XML напрямую, потому что они наследуют это как пространство имен, указанное в корне. В принципе, везде, где вы создаете элемент, вы, вероятно, захотите использовать ns1. Итак:

new XElement(ns1 + "shipment", new XElement(ns1 + "header", ...), ...) 

Чтобы лучше понять, почему это необходимо, вы должны прочитать на namespace defaulting в спецификации XML Namespaces.

и другая проблема удаления декларации XML

Так добавьте XDeclaration к XDocument:

XDocument doc = new XDocument(new XDeclaration("1.0", "utf-8", "yes")) 
+0

Спасибо Jon за ссылку. Из формы примера xml из страницы sears api faq она не отображает объявление xml, поэтому поэтому я не помещал XDeclaration в документ, но он отображается как значение по умолчанию. То, что я пытаюсь сделать, это получить файл в точности так, как показано в примере. – zerodoc

+0

@zerodoc: Я был бы очень удивлен, если бы объявление XML действительно было проблемой. –

+0

ok thanks, btw добавив пространство имен ко всем XElements, избавленным от . Просто хотел убедиться, что мой XML-документ был сформирован прямо перед тем, как я открыл случай, чтобы понять, что вы не можете загрузить XML-документ. – zerodoc

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