从XML中提取标记名称、属性、值和文本上下文

本文关键字:属性 上下文 文本 XML 提取 | 更新日期: 2023-09-27 18:28:20

我想从给定的xml字符串中提取所有元素标记名称、属性、值和文本内容。

例如:

<instructor >
	<title degree= “PhD” year = “2012” school = “USC”>Professor</title>
	<name>	
		<first>FirstName</first>
		<last>LastName</last>
	</name>
	<course level = “Junior”>XML</course>
	<officeHours>10</officeHours>
</instructor>

我希望我的代码返回所有标签名称、属性、值和文本内容。例如:标签名称:讲师,职称,姓名,课程,办公时间。属性:学位、年份、学校、级别。数值:博士,2012年,南加州大学。text:教授,名字,姓氏,10。

如何在C#中做到这一点。

从XML中提取标记名称、属性、值和文本上下文

给定rootXElement,从以下内容获得:

var root = XElement.Parse(myXmlString);

并且预先初始化Dictionary<string, List<string>>(相当于HashMap),下面的函数将完成您需要的操作:

static void TraverseXElement(XElement elem, Dictionary<string, List<string>> aggregation)
{
    const string valuesKey = "Values";
    const string tagNameKey = "Tag Name";
    const string attributesKey = "Attributes";
    aggregation[tagNameKey].Add(elem.Name.LocalName);
    foreach (var childText in elem.Nodes().OfType<XText>())
    {
        //immediate values, even in case of wrongly formed XML
        aggregation[valuesKey].Add(childText.Value); 
    }
    foreach (var element in elem.Elements())
    {
        TraverseXElement(element, aggregation);
    }
    foreach (var attr in elem.Attributes())
    {
        aggregation[attributesKey].Add(attr.Name.LocalName);
        aggregation[valuesKey].Add(attr.Value);
    }
}

对最后两个循环重新排序将更改值的顺序。