XML命名空间未正确格式化

时间:2013-11-16 16:59:19

标签: c# xml linq-to-xml

构建XML XDocument以推送到Web服务,并且根元素需要名称空间值,这就是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;
}

第一个问题是第一个子节点我没有看到它来自何处,因为该节点甚至在foreach循环之前都没有被声明。我的印象是我只是在根元素中添加了属性。

另一个问题是删除xml声明

1 个答案:

答案 0 :(得分:2)

这就是问题所在:

new XElement("shipment", ...)

您希望shipment元素位于"http://seller.marketplace.sears.com/oms/v5"命名空间中 - 因此您需要明确这些元素。这不会直接显示在生成的XML中,因为它们会将其作为根中指定的默认命名空间继承。基本上,无论您在哪里创建元素,您都可能想要使用ns1。所以:

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

要更多地了解为什么需要这样做,您应该阅读XML命名空间规范中的namespace defaulting

  

另一个问题是删除xml声明

所以在XDocument添加XDeclaration

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