You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#生成XML时xmlns属性冗余问题求助

问题

我用C#生成XML文件时遇到个问题:当前代码会给所有外层子节点都加上xmlns=""属性,但我只需要在根节点WarehouseReceipt上保留命名空间属性。试过移除命名空间,但没有它的话C#会因为缺少架构引用不认可这个XML文件。另外,XML的结构完全符合需求,不用调整结构。

现有代码

XNamespace xNamespace = "urlhere";
XElement newXML = new XElement(xNamespace + "WarehouseReceipt",
                new XAttribute("Type", "WH"),
                new XElement("Number", tempN[0]),
                new XElement("ShipperName", tempS[0]),
                new XElement("ConsigneeName", tempC[0]),
                new XElement("Items",
                from str in csv
                let fields = str.Split(',')
                select new XElement("Item",
                     new XAttribute("Type", "WI"),
                     new XElement("Satus", fields[3]),
                     new XElement("Pieces", fields[6]),
                     new XElement("Description", fields[5]),
                     new XElement("PackageName", fields[4]),
                     new XElement("Length",
                         new XAttribute("Unit", "in"), fields[7]),
                     new XElement("Volume",
                         new XAttribute("Unit", "ft3"), fields[11]),
                     new XElement("Height",
                         new XAttribute("Unit", "in"), fields[8]),
                     new XElement("Width",
                         new XAttribute("Unit", "in"), fields[9]),
                     new XElement("Weight",
                         new XAttribute("Unit", "lb"), fields[10]),
                     new XElement("WarehouseReceiptNumber", fields[0])
                 )
                ),
                new XElement("MeasurementUnits",
                    new XElement("LengthUnit", "in"),
                    new XElement("VolumeUnit", "ft3"),
                    new XElement("WeightUnit", "lb")
               )
          );
return newXML;

当前输出

<WarehouseReceipt Type="WH" xmlns="urlhere">
  <Number xmlns="">"3519"</Number>
  <ShipperName xmlns=""> "4 NET NETWORKING CORP"</ShipperName>
  <ConsigneeName xmlns=""> "ACUAMAR"</ConsigneeName>
  <Items xmlns="">
    <Item Type="WI">
      <Satus> "On Hand"</Satus>
      <Pieces> "10"</Pieces>
      <Description> "APPLE NEW IPAD"</Description>
      <PackageName> "Case"</PackageName>
      <Length Unit="in"> "5.00"</Length>
      <Volume Unit="ft3"> "0.60"</Volume>
      <Height Unit="in"> "5.00"</Height>
      <Width Unit="in"> "4.00"</Width>
      <Weight Unit="lb"> "10.00"</Weight>
      <WarehouseReceiptNumber>"3519"</WarehouseReceiptNumber>
    </Item>
    <Item Type="WI">
      <Satus> "On Hand"</Satus>
      <Pieces> "20"</Pieces>
      <Description> "APPLE IMAC "</Description>
      <PackageName> "Box"</PackageName>
      <Length Unit="in"> "35.00"</Length>
      <Volume Unit="ft3"> "273.40"</Volume>
      <Height Unit="in"> "45.00"</Height>
      <Width Unit="in"> "15.00"</Width>
      <Weight Unit="lb"> "400.00"</Weight>
      <WarehouseReceiptNumber>"3519"</WarehouseReceiptNumber>
    </Item>
  </Items>
  <MeasurementUnits xmlns="">
    <LengthUnit>in</LengthUnit>
    <VolumeUnit>ft3</VolumeUnit>
    <WeightUnit>lb</WeightUnit>
  </MeasurementUnits>
</WarehouseReceipt>

解决方案

问题根源是:根节点属于指定命名空间,但所有子节点都未关联该命名空间,LINQ to XML会自动给这些子节点添加xmlns=""来明确它们属于无命名空间范畴。要解决这个问题,只需让所有子节点都继承根节点的命名空间,这样就不会生成多余的xmlns属性。

修改方法很直接:创建所有子节点时,统一使用xNamespace + "节点名"的格式,和根节点保持一致。修改后的代码如下:

修改后的代码

XNamespace xNamespace = "urlhere";
XElement newXML = new XElement(xNamespace + "WarehouseReceipt",
                new XAttribute("Type", "WH"),
                new XElement(xNamespace + "Number", tempN[0]),
                new XElement(xNamespace + "ShipperName", tempS[0]),
                new XElement(xNamespace + "ConsigneeName", tempC[0]),
                new XElement(xNamespace + "Items",
                from str in csv
                let fields = str.Split(',')
                select new XElement(xNamespace + "Item",
                     new XAttribute("Type", "WI"),
                     new XElement(xNamespace + "Satus", fields[3]),
                     new XElement(xNamespace + "Pieces", fields[6]),
                     new XElement(xNamespace + "Description", fields[5]),
                     new XElement(xNamespace + "PackageName", fields[4]),
                     new XElement(xNamespace + "Length",
                         new XAttribute("Unit", "in"), fields[7]),
                     new XElement(xNamespace + "Volume",
                         new XAttribute("Unit", "ft3"), fields[11]),
                     new XElement(xNamespace + "Height",
                         new XAttribute("Unit", "in"), fields[8]),
                     new XElement(xNamespace + "Width",
                         new XAttribute("Unit", "in"), fields[9]),
                     new XElement(xNamespace + "Weight",
                         new XAttribute("Unit", "lb"), fields[10]),
                     new XElement(xNamespace + "WarehouseReceiptNumber", fields[0])
                 )
                ),
                new XElement(xNamespace + "MeasurementUnits",
                    new XElement(xNamespace + "LengthUnit", "in"),
                    new XElement(xNamespace + "VolumeUnit", "ft3"),
                    new XElement(xNamespace + "WeightUnit", "lb")
               )
          );
return newXML;

修改后输出

<WarehouseReceipt Type="WH" xmlns="urlhere">
  <Number>"3519"</Number>
  <ShipperName> "4 NET NETWORKING CORP"</ShipperName>
  <ConsigneeName> "ACUAMAR"</ConsigneeName>
  <Items>
    <Item Type="WI">
      <Satus> "On Hand"</Satus>
      <Pieces> "10"</Pieces>
      <Description> "APPLE NEW IPAD"</Description>
      <PackageName> "Case"</PackageName>
      <Length Unit="in"> "5.00"</Length>
      <Volume Unit="ft3"> "0.60"</Volume>
      <Height Unit="in"> "5.00"</Height>
      <Width Unit="in"> "4.00"</Width>
      <Weight Unit="lb"> "10.00"</Weight>
      <WarehouseReceiptNumber>"3519"</WarehouseReceiptNumber>
    </Item>
    <Item Type="WI">
      <Satus> "On Hand"</Satus>
      <Pieces> "20"</Pieces>
      <Description> "APPLE IMAC "</Description>
      <PackageName> "Box"</PackageName>
      <Length Unit="in"> "35.00"</Length>
      <Volume Unit="ft3"> "273.40"</Volume>
      <Height Unit="in"> "45.00"</Height>
      <Width Unit="in"> "15.00"</Width>
      <Weight Unit="lb"> "400.00"</Weight>
      <WarehouseReceiptNumber>"3519"</WarehouseReceiptNumber>
    </Item>
  </Items>
  <MeasurementUnits>
    <LengthUnit>in</LengthUnit>
    <VolumeUnit>ft3</VolumeUnit>
    <WeightUnit>lb</WeightUnit>
  </MeasurementUnits>
</WarehouseReceipt>

现在所有子节点都和根节点同属一个命名空间,XML解析器会自动继承根节点的命名空间配置,既不会生成多余的xmlns=""属性,也保留了架构验证所需的命名空间引用。

内容的提问来源于stack exchange,提问作者Brandon Torrens

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 20:03:20