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
相关产品推荐
相关产品推荐

