如何提取XML中property元素的name与value属性列表?
解决方案:提取XML中带name和value的属性列表
你的问题核心是XML包含默认命名空间,之前的查询未处理命名空间导致无法匹配目标元素,以下是三种可行的实现方式:
方法1:LINQ to XML(推荐)
通过指定命名空间定位property元素,直接提取属性值:
using System; using System.Xml.Linq; class Program { static void Main() { string xml = @"<root> <property name=""com.jaspersoft.studio.js.ic.path"" value=""/InputControls/pEnforcementStatusID"" xmlns=""http://jasperreports.sourceforge.net/jasperreports"" /> <property name=""com.jaspersoft.studio.js.ic.label"" value=""Enforcement Status ID"" xmlns=""http://jasperreports.sourceforge.net/jasperreports"" /> <defaultValueExpression xmlns=""http://jasperreports.sourceforge.net/jasperreports""><![CDATA[0]]></defaultValueExpression> </root>"; XDocument doc = XDocument.Parse(xml); // 声明XML默认命名空间 XNamespace jrNs = "http://jasperreports.sourceforge.net/jasperreports"; var propertyElements = doc.Descendants(jrNs + "property"); int index = 1; foreach (var prop in propertyElements) { string nameAttr = $"name=\"{prop.Attribute("name")?.Value}\""; string valueAttr = $"\"{prop.Attribute("value")?.Value}\""; Console.WriteLine($"{index}. `{nameAttr}` 对应 value `{valueAttr}`"); index++; } } }
方法2:XPath(处理命名空间)
注册命名空间管理器,通过带前缀的XPath查询目标元素:
using System; using System.Xml; class Program { static void Main() { string xml = @"<root> <property name=""com.jaspersoft.studio.js.ic.path"" value=""/InputControls/pEnforcementStatusID"" xmlns=""http://jasperreports.sourceforge.net/jasperreports"" /> <property name=""com.jaspersoft.studio.js.ic.label"" value=""Enforcement Status ID"" xmlns=""http://jasperreports.sourceforge.net/jasperreports"" /> <defaultValueExpression xmlns=""http://jasperreports.sourceforge.net/jasperreports""><![CDATA[0]]></defaultValueExpression> </root>"; XmlDocument doc = new XmlDocument(); doc.LoadXml(xml); // 注册命名空间前缀 XmlNamespaceManager nsMgr = new XmlNamespaceManager(doc.NameTable); nsMgr.AddNamespace("jr", "http://jasperreports.sourceforge.net/jasperreports"); XmlNodeList propertyNodes = doc.SelectNodes("//jr:property", nsMgr); int index = 1; foreach (XmlNode node in propertyNodes) { string nameAttr = node.Attributes["name"].OuterXml; string valueAttr = node.Attributes["value"].OuterXml.Split('=')[1]; Console.WriteLine($"{index}. `{nameAttr}` 对应 value `{valueAttr}`"); index++; } } }
方法3:XmlReader
读取时校验元素的命名空间和本地名称,匹配后提取属性:
using System; using System.IO; using System.Xml; class Program { static void Main() { string xml = @"<root> <property name=""com.jaspersoft.studio.js.ic.path"" value=""/InputControls/pEnforcementStatusID"" xmlns=""http://jasperreports.sourceforge.net/jasperreports"" /> <property name=""com.jaspersoft.studio.js.ic.label"" value=""Enforcement Status ID"" xmlns=""http://jasperreports.sourceforge.net/jasperreports"" /> <defaultValueExpression xmlns=""http://jasperreports.sourceforge.net/jasperreports""><![CDATA[0]]></defaultValueExpression> </root>"; using (XmlReader reader = XmlReader.Create(new StringReader(xml))) { string targetNs = "http://jasperreports.sourceforge.net/jasperreports"; int index = 1; while (reader.Read()) { // 匹配带目标命名空间的property元素 if (reader.NodeType == XmlNodeType.Element && reader.NamespaceURI == targetNs && reader.LocalName == "property") { string name = reader.GetAttribute("name"); string value = reader.GetAttribute("value"); string nameAttr = $"name=\"{name}\""; string valueAttr = $"\"{value}\""; Console.WriteLine($"{index}. `{nameAttr}` 对应 value `{valueAttr}`"); index++; } } } } }
内容的提问来源于stack exchange,提问作者user2142422
相关产品推荐
相关产品推荐

