首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XML名称空间格式不正确

XML名称空间格式不正确
EN

Stack Overflow用户
提问于 2013-11-16 16:59:18
回答 1查看 176关注 0票数 0

构建XML XDocument以推送到web服务,根元素需要名称空间值--这是XML表单应该看起来的样子.

代码语言:javascript
复制
<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 ..。

代码语言:javascript
复制
<?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#代码..。

代码语言:javascript
复制
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声明。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-16 17:02:01

这类事情就是问题所在:

代码语言:javascript
复制
new XElement("shipment", ...)

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

代码语言:javascript
复制
new XElement(ns1 + "shipment", new XElement(ns1 + "header", ...), ...)

为了更多地了解为什么需要这样做,您应该阅读名称空间默认名称空间规范中的内容。

另一个问题是删除xml声明。

因此,将XDeclaration添加到XDocument

代码语言:javascript
复制
XDocument doc = new XDocument(new XDeclaration("1.0", "utf-8", "yes"))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20021152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档