【问题标题】:XML Name Space Not Formating CorrectlyXML 名称空间格式不正确
【发布时间】:2013-11-16 16:59:18
【问题描述】:

构建一个 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 声明

【问题讨论】:

    标签: c# xml linq-to-xml


    【解决方案1】:

    这就是问题所在:

    new XElement("shipment", ...)
    

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

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

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

    另一个问题是删除 xml 声明

    所以将XDeclaration 添加到XDocument

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

    【讨论】:

    • 感谢乔恩提供的链接。从 sears api 常见问题页面的 xml 示例表单中,它没有显示 xml 声明,所以这就是为什么我没有在文档中放置 XDeclaration 但它显示为默认值。我要做的是完全按照示例中所示获取文件。
    • @zerodoc:如果 XML 声明实际上是一个问题,我会感到非常惊讶。
    • 好的,谢谢,顺便说一句,将命名空间添加到所有 XElements 摆脱了 。只是想在我打开一个关于无法上传 xml 文档的案例之前确保我的 xml 文档的格式正确。
    • @zerodoc:这不是真正的格式化问题 - 这是元素在哪个命名空间中的语义问题。很高兴它对你有用.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    • 2013-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    相关资源
    最近更新 更多