如何从指定XML中提取追踪号?使用反射遇阻求技术指导
提取XML中追踪号的解决方案
方法一:直接用LINQ to XML解析(无需反射)
这是最直接高效的方式,无需依赖实体类或反射,直接定位目标节点即可:
using System.Xml.Linq; // 你的XML内容 var xmlContent = @"<ShipmentHeader> <DocumentID>62017836-1</DocumentID> <DocumentReference type=""CustomerSuppliedReference""> <DocumentID> <ID>10532</ID> </DocumentID> </DocumentReference> <Status> <Code/> <Description languageID=""en-us""/> </Status> <ActualShipDateTime>2023-06-07T09:16:33-04:00</ActualShipDateTime> <ShippingMethod>CHEAPEST METHOD W/FIRST CLASS</ShippingMethod> <DocumentReference type=""TrackingNumber""> <TrackingNumber>9200190233107605458375</TrackingNumber> </DocumentReference> </ShipmentHeader>"; // 解析XML并提取追踪号 var doc = XDocument.Parse(xmlContent); var trackingNumber = doc.Descendants("DocumentReference") .FirstOrDefault(dr => dr.Attribute("type")?.Value == "TrackingNumber") ?.Element("TrackingNumber")?.Value; // 最终结果:9200190233107605458375
方法二:结合实体类与反射(若必须用反射)
如果你的场景确实需要用到反射,需先将XML序列化为实体对象,再通过反射获取目标属性:
1. 定义对应实体类
using System.Xml.Serialization; using System.Collections.Generic; [XmlRoot("ShipmentHeader")] public class ShipmentHeader { [XmlElement("DocumentReference")] public List<DocumentReference> DocumentReferences { get; set; } = new List<DocumentReference>(); } public class DocumentReference { [XmlAttribute("type")] public string Type { get; set; } [XmlElement("TrackingNumber")] public string TrackingNumber { get; set; } // 可添加其他对应XML节点的属性 }
2. 序列化XML并通过反射提取值
using System.Xml.Serialization; using System.IO; var serializer = new XmlSerializer(typeof(ShipmentHeader)); using var stringReader = new StringReader(xmlContent); var shipment = (ShipmentHeader)serializer.Deserialize(stringReader); // 遍历DocumentReferences,用反射获取目标属性 foreach (var docRef in shipment.DocumentReferences) { if (docRef.Type == "TrackingNumber") { var trackingNumProp = docRef.GetType().GetProperty("TrackingNumber"); var trackingNumber = trackingNumProp?.GetValue(docRef) as string; // 得到追踪号:9200190233107605458375 break; } }
注意
反射在这里并非必要操作,直接访问实体类属性的代码会更简洁易维护。只有在处理动态未知的实体结构时,反射才有实际意义。
内容的提问来源于stack exchange,提问作者Trevor Daniel
相关产品推荐
相关产品推荐

