如何使用c#在xml的根标签中删除默认命名空间并添加自定义命名空间

本文关键字:命名空间 默认 删除 自定义 添加 标签 何使用 xml | 更新日期: 2023-09-27 17:51:09

从c#类创建xml时,我在根标签(Order)中获得一些默认名称空间(xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"),如下所示。但是,我想删除这些默认名称空间,并且我需要根标签中的以下名称空间(订单xmlns="http://example.com/xml/1.0")。如何在c#代码中删除和替换这些默认名称空间。提前谢谢。

<?xml version="1.0"?>
<Order xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <Number Type="mobile">9999999999</Number>
   <TrackStartDateTime>2015-05-30 11:00 ET</TrackStartDateTime>
   <Notifications>
      <Notification>
         <PartnerMPID>99999999</PartnerMPID>
         <IDNumber>L563645</IDNumber>
         <TrackDurationInHours>120</TrackDurationInHours>
         <TrackIntervalInMinutes>240</TrackIntervalInMinutes>
      </Notification>
   </Notifications>
   <Carrier>
      <Dispatcher>
         <DispatcherName>?</DispatcherName>
         <DispatcherPhone>0</DispatcherPhone>
         <DispatcherEmail>?</DispatcherEmail>
      </Dispatcher>
   </Carrier>
</Order>

我使用了以下c#类:

    [XmlRoot("Order")]
    public class Order
    {
        [XmlElement("Number")]
        public Number Number;
        [XmlElement("TrackStartDateTime")]
        public string TrackStartDateTime;//TODO - need to check         
        [XmlElement("Notifications")]
        public Notifications Notifications;//TODO - notification tag should come inside Notifications tag
        [XmlElement("Carrier")]
        public Carrier Carrier;           
        public Order() {
            Number = new Number();
            Notifications = new Notifications();
            Carrier = new Carrier();
            TripSheet = new TripSheet();
        }
    }
    public class Number
    {
        [XmlAttribute("Type")]
        public string Type;
        [XmlText]
        public Int64 Value;
    }
    public class Notifications {
        [XmlElement("Notification")]
        public List<Notification> Notification;
        public Notifications() {
            Notification = new List<Notification>();
        }
    }
    public class Notification
    {
        [XmlElement("PartnerMPID")]
        public string PartnerMPID { get; set; }
        [XmlElement("IDNumber")]
        public string IDNumber { get; set; }
        [XmlElement("TrackDurationInHours")]
        public int TrackDurationInHours { get; set; }
        [XmlElement("TrackIntervalInMinutes")]
        public int TrackIntervalInMinutes { get; set; }
    }
    public class Carrier
    {
        [XmlElement("Name")]
        public string Name;
        [XmlElement("Dispatcher")]
        public Dispatcher Dispatcher;
        public Carrier() {
            Dispatcher = new Dispatcher();
        }
    }
    public class Dispatcher
    {
        [XmlElement("DispatcherName")]
        public string DispatcherName;
        [XmlElement("DispatcherPhone")]
        public Int64 DispatcherPhone;
        [XmlElement("DispatcherEmail")]
        public string DispatcherEmail;//conform format for email         
    }

和我已经采用了Order Class的新实例,出于测试目的,我为每个字段都硬编码了值,并且我使用了以下代码来从c#类创建xml。

    public string CreateXML(Order order)
    {
        XmlDocument xmlDoc = new XmlDocument(); 
        XmlSerializer xmlSerializer = new XmlSerializer(typeof(Order));  
        // Creates a stream whose backing store is memory. 
        using (MemoryStream xmlStream = new MemoryStream())
        {                
            xmlSerializer.Serialize(xmlStream, order);//,ns  
            xmlStream.Position = 0;                
            //Loads the XML document from the specified string.
            xmlDoc.Load(xmlStream);
            return xmlDoc.InnerXml;
        }
    }

我不确定这是从c#类创建xml的正确方法。请指导我从c#类中获得以下xml输出。

<?xml version="1.0"?>
<Order xmlns="http://example.com/xml/1.0" >
   <Number Type="mobile">9999999999</Number>
   <TrackStartDateTime>2015-05-30 11:00 ET</TrackStartDateTime>
   <Notifications>
      <Notification>
         <PartnerMPID>99999999</PartnerMPID>
         <IDNumber>L563645</IDNumber>
         <TrackDurationInHours>120</TrackDurationInHours>
         <TrackIntervalInMinutes>240</TrackIntervalInMinutes>
      </Notification>
   </Notifications>
   <Carrier>
      <Dispatcher>
         <DispatcherName>?</DispatcherName>
         <DispatcherPhone>0</DispatcherPhone>
         <DispatcherEmail>?</DispatcherEmail>
      </Dispatcher>
   </Carrier>
</Order>

如何使用c#在xml的根标签中删除默认命名空间并添加自定义命名空间

这是一种方法…只需创建一个新的XDocument并设置您想要的名称空间,并将原始xml后代移植到其中,如下所示:

        var xml = "<?xml version='"1.0'"?><Order xmlns:xsi='"http://www.w3.org/2001/XMLSchema-instance'" xmlns:xsd='"http://www.w3.org/2001/XMLSchema'"><Number Type='"mobile'">9999999999</Number></Order>";
        var xdoc = XDocument.Parse(xml);            
        var ns = XNamespace.Get("http://example.com/xml/1.0");
        var xdoc2 = new XDocument(new XDeclaration("1.0", null, null),
                                 new XElement(ns + "Order", xdoc.Root.Descendants()));

查看这里的工作示例:https://dotnetfiddle.net/JYCL95

对于这种情况,只需在类定义上使用的XMLRoot装饰中添加一个空名称空间就足够了。

[XmlRoot("Order", Namespace = null)]
public class Order
{
    [XmlElement("Number")]
    public Number Number;
    [XmlElement("TrackStartDateTime")]
    public string TrackStartDateTime;         
    [XmlElement("Notifications")]
    public Notifications Notifications;
    [XmlElement("Carrier")]
    public Carrier Carrier;