如何不使用XPath读取嵌套XML节点?XmlDocument使用求助
解决方法
你的XML结构比较特殊:<DataElement>的文本内容是DocumentEntity="Borrower"|DataType="Table"|Value="..."这种分隔格式,其中Value部分嵌套了完整的XML字符串。需要先解析这个分隔文本提取出嵌套XML,再将其作为独立XML处理,才能读取每个Borrower节点的数据。
以下是结合XmlDocument的具体实现步骤:
步骤1:定位目标DataElement节点
先加载整个XML文档,找到Name="Borrower"的DataElement节点:
XmlDocument doc = new XmlDocument(); doc.LoadXml(yourXmlContent); // 替换为你的XML字符串或文件加载路径 XmlNode targetNode = doc.SelectSingleNode("//DataElement[@Name='Borrower']"); if (targetNode == null) { // 处理节点不存在的异常情况 return; }
步骤2:解析文本内容,提取嵌套XML
targetNode.InnerText会返回节点内的分隔格式文本,需要按|拆分键值对,提取Value对应的XML内容并去除前后引号:
string rawContent = targetNode.InnerText.Trim(); string[] keyValuePairs = rawContent.Split('|'); string nestedXml = string.Empty; foreach (string pair in keyValuePairs) { string[] kv = pair.Split(new[] { '=' }, 2); if (kv.Length == 2 && kv[0].Trim() == "Value") { // 移除Value值前后的双引号 nestedXml = kv[1].Trim().Trim('"'); break; } } if (string.IsNullOrEmpty(nestedXml)) { // 处理未提取到嵌套XML的情况 return; }
步骤3:加载嵌套XML,读取Borrower节点
将提取到的嵌套XML加载为新的XML文档,就可以正常遍历每个Borrower节点及其字段:
XmlDocument borrowerDoc = new XmlDocument(); borrowerDoc.LoadXml(nestedXml); // 获取Borrowers下的所有子节点(即Borrower1、Borrower2等) XmlNodeList borrowerNodes = borrowerDoc.SelectNodes("//Borrowers/*"); foreach (XmlNode borrower in borrowerNodes) { // 注意:你的Field节点内容是"Value=\"Value1\""格式,需提取实际值 string field1 = borrower.SelectSingleNode("Field1").InnerText.Replace("Value=\"", "").Replace("\"", ""); string field2 = borrower.SelectSingleNode("Field2").InnerText.Replace("Value=\"", "").Replace("\"", ""); // 按需处理字段数据,比如输出 Console.WriteLine($"{borrower.Name}: Field1={field1}, Field2={field2}"); }
可选:用LINQ to XML简化代码
如果使用XDocument(LINQ to XML),代码会更简洁:
XDocument mainDoc = XDocument.Parse(yourXmlContent); var targetElement = mainDoc.Descendants("DataElement") .FirstOrDefault(d => (string)d.Attribute("Name") == "Borrower"); if (targetElement == null) return; string rawContent = targetElement.Value.Trim(); string nestedXml = rawContent.Split('|') .First(p => p.StartsWith("Value=")) .Split('=')[1] .Trim('"'); XDocument borrowerDoc = XDocument.Parse(nestedXml); foreach (var borrower in borrowerDoc.Descendants("Borrowers").Elements()) { string field1 = borrower.Element("Field1").Value.Replace("Value=\"", "").Replace("\"", ""); string field2 = borrower.Element("Field2").Value.Replace("Value=\"", "").Replace("\"", ""); Console.WriteLine($"{borrower.Name}: Field1={field1}, Field2={field2}"); }
内容的提问来源于stack exchange,提问作者user1595214
相关产品推荐
相关产品推荐

