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

时间:2014-10-30 09:32:18

标签: c# xml xml-parsing

我想从给定的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>
&#13;
&#13;
&#13;

我希望我的代码返回所有标记名称,属性,值和文本内容。 例如:标签名称:讲师,职称,名称,课程,办公室时间。 attibutes:学位,年份,学校,水平。 值:博士,2012年,南加州大学。 text:professor,firstName,LastName,10。

如何在C#中执行此操作。

1 个答案:

答案 0 :(得分:0)

给定 root XElement,从以下内容获得:

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);
    }
}

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