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")]