如何通用提取XML中客户属性标签名至List<string>?
解析HTML包裹的XML中客户相关标签名到字符串列表
问题场景
我有一个嵌入在网页中的XML结构,用来存储单个客户信息,示例结构如下:
<?xml version="1.0" encoding="UTF-8" ?> <html> <head></head> <body> <document> <Name>Pablo</Name> <Surname>Salamanca</Surname> <Age>68</Age> <Gender>M</Gender> </document> </body> </html>
网页仅展示客户的字段值:Pablo Salamanca 68 M
需要注意:
- 存在近15种无标准化的XML结构模板,不同客户的信息顺序、内容差异大,仅标签值和顺序变化,外层HTML+document的框架不变。
- 每个客户的XML包含68~278个属性/元素。
需求目标
将仅属于客户的标签名提取到List<string>中,示例结果:
List[0] = "Name" List[1] = "Surname" List[2] = "Age" List[3] = "Gender" ...
已有代码
目前已实现从URL获取内容并做初步处理:
var url = _urlMaker.GetUrl(); WebClient client = new WebClient(); client.Encoding = System.Text.Encoding.GetEncoding("utf-8"); string xml = client.DownloadString(url); int n = 2; List<string> xmlSplit = xml .Split(Environment.NewLine.ToCharArray()) .Skip(n) .ToList(); xml = string.Join(Environment.NewLine, xmlSplit);
注:拆分并移除前两行是因为原文档是HTML结构,Visual Studio无法直接完整解析,通过此处理转为可解析的XML格式,目前其他部分已能正常解析字段值。
原本考虑用XmlDocument.GetElementsByTagName方法,但由于无法预知具体标签名,无法直接使用。
通用解决方案
方案1:使用XDocument直接解析(推荐,适用于XML结构规范的情况)
无需拆分字符串,直接用XDocument解析整个内容,提取<document>节点下的所有子元素标签名:
var url = _urlMaker.GetUrl(); // 使用using确保WebClient资源释放 using (WebClient client = new WebClient()) { client.Encoding = System.Text.Encoding.UTF8; string xmlContent = client.DownloadString(url); // 直接解析包含HTML包裹的XML XDocument doc = XDocument.Parse(xmlContent); // 提取<document>下的所有客户标签名 List<string> customerTags = doc.Descendants("document") .Elements() .Select(e => e.Name.LocalName) .ToList(); }
优势:不管内部标签顺序如何变化,只要客户字段在<document>节点下,就能精准提取,完全适配不同模板。
方案2:过滤无关标签(适用于无法确定document节点名称的情况)
如果<document>节点名称也可能变化,可以遍历所有元素,排除已知的无关标签:
var url = _urlMaker.GetUrl(); using (WebClient client = new WebClient()) { client.Encoding = System.Text.Encoding.UTF8; string xmlContent = client.DownloadString(url); XDocument doc = XDocument.Parse(xmlContent); // 定义需要排除的外层标签 List<string> excludeTags = new List<string> { "html", "head", "body", "document" }; // 提取所有非排除标签,可根据需求添加Distinct()去重 List<string> customerTags = doc.Descendants() .Select(e => e.Name.LocalName) .Where(tag => !excludeTags.Contains(tag)) .ToList(); }
方案3:使用HtmlAgilityPack处理不规范HTML(适用于原HTML结构不标准的情况)
如果原文档HTML标签不闭合、格式混乱,先用HtmlAgilityPack处理HTML,再提取目标XML部分:
- 先通过NuGet安装
HtmlAgilityPack包 - 编写代码:
var url = _urlMaker.GetUrl(); using (WebClient client = new WebClient()) { client.Encoding = System.Text.Encoding.UTF8; string htmlContent = client.DownloadString(url); HtmlDocument htmlDoc = new HtmlDocument(); htmlDoc.LoadHtml(htmlContent); // 获取<document>节点的完整内容 HtmlNode documentNode = htmlDoc.DocumentNode.SelectSingleNode("//document"); if (documentNode != null) { string documentXml = documentNode.OuterHtml; XDocument doc = XDocument.Parse(documentXml); List<string> customerTags = doc.Root.Elements() .Select(e => e.Name.LocalName) .ToList(); } }
优势:能处理各种不规范的HTML结构,确保后续XML解析的准确性。
内容的提问来源于stack exchange,提问作者Matěj
相关产品推荐
相关产品推荐

