XML记一次带命名空间的xml读取

public static void ReadXML(string xmlUrl)
        {
            //判断文件是否存在
            if (!File.Exists(xmlUrl))
            {
                Console.WriteLine($"文件路径不正确,没有查找到请确认路径:{xmlUrl}");
                return;
            }
            //加载文档
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.IgnoreComments = true;//忽略文档里面的注释
            XmlDocument doc = new XmlDocument(); doc.Load(xmlUrl); XmlNamespaceManager nameSpace = new XmlNamespaceManager(doc.NameTable); nameSpace.AddNamespace("xs", "http://centiro.com/deliveryxml.xsd"); XmlElement resume = doc.DocumentElement; //得到根节点shipments XmlNode rootNode = resume; // 得到根类shipment XmlNode root = resume.SelectSingleNode("xs:shipment", nameSpace); //XmlNode root = doc.ChildNodes.Item(0).ChildNodes.Item(0); //得到shipment的子节点 //XmlNodeList rootAtt = root.ChildNodes; //读取节点数据打印 foreach (XmlNode item in root) { Console.WriteLine($"当前节点名称:{item.Name.ToString()},---值:{item.InnerText.ToString()}"); } //读取节点需要转化到数据库根据类名称 //XMLToClass(root, nameSpace); shipment shipment = DeserializeXML<shipment>(rootNode.InnerXml); if (root.SelectSingleNode("xs:addresses", nameSpace) != null) { XmlNode addresses = root.SelectSingleNode("xs:addresses", nameSpace); List<address> addressList = new List<address>(); foreach (XmlNode item in addresses) { address addre = new address(); Console.WriteLine($"------------------------------【addresses】-------------------------------------"); Console.WriteLine($"当前节点名称:{item.Name.ToString()},---值:{item.InnerText.ToString()}"); string xmlStr = "<address>" + item.InnerXml + "</address>"; addressList.Add(DeserializeXML<address>(xmlStr)); } shipment.addresses = addressList; } //如果需要转义保存 // doc.Save(@"textSave.xml");  }

然后下面是两种xml解析成对象的形式:

第一种变量赋值-很low:

 public static void XMLToClass(XmlNode root, XmlNamespaceManager nameSpace)
        {
            //读取节点需要转化到数据库根据类名称
            shipment shipment = new shipment();
            shipment.operation = root.SelectSingleNode("xs:operation", nameSpace).InnerText;
            shipment.deliveryMethod = root.SelectSingleNode("xs:deliveryMethod", nameSpace) == null ? "" : root.SelectSingleNode("xs:deliveryMethod", nameSpace).InnerText; shipment.timeWindowDateFrom = root.SelectSingleNode("xs:timeWindowDateFrom", nameSpace).InnerText; shipment.timeWindowDateTo = root.SelectSingleNode("xs:timeWindowDateTo", nameSpace).InnerText; if (root.SelectSingleNode("xs:exchange", nameSpace) != null) { shipment.exchange = root.SelectSingleNode("xs:exchange", nameSpace).InnerText == "True" ? true : false; }if (root.SelectSingleNode("xs:addresses", nameSpace) != null) { XmlNode addresses = root.SelectSingleNode("xs:addresses", nameSpace); foreach (XmlNode item in addresses) { address addre = new address(); Console.WriteLine($"------------------------------【addresses】-------------------------------------"); Console.WriteLine($"当前节点名称:{item.Name.ToString()},---值:{item.InnerText.ToString()}"); DeserializeXML<address>(addresses.InnerXml); }  } }

第二种序列化类实现:

 public static T DeserializeXML<T>(string xmlStr)
        {
            //序列化前
            xmlStr = xmlStr.Replace("xmlns=\"http://centiro.com/deliveryxml.xsd\"", "");
            //序列化
            using (StringReader reader = new StringReader(xmlStr))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(T));
                NameTable nt = new NameTable();
                XmlNamespaceManager nsManager = new XmlNamespaceManager(nt); nsManager.AddNamespace("one", "http://centiro.com/deliveryxml.xsd"); XmlParserContext context = new XmlParserContext(null, nsManager, null, XmlSpace.None); XmlReaderSettings xmlReaderSettings = new XmlReaderSettings(); xmlReaderSettings.ConformanceLevel = ConformanceLevel.Fragment; XmlReader xmlReader = System.Xml.XmlReader.Create(reader); return (T)serializer.Deserialize(xmlReader); } }

 这种最主要需要在类的上面添加:

[XmlRoot(Namespace = "", IsNullable = false, ElementName = "address")]

 

转载于:https://www.cnblogs.com/yanbigfeg/p/10237252.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值