如何在C#中的元素中获取XML属性

时间:2016-05-27 14:13:33

标签: c# .net xml visual-studio-2015

您好,我希望有人可以帮助我,我一直在试图在XML文件中获取特定文本,但到目前为止还没有成功。我已经研究了很多,到目前为止,互联网上找不到的任何项目都没有用。

我正在尝试读取由第三方应用程序生成的导出XML文件。现在我开始怀疑XML是否是根据正确的XML规则设置的?我有以下XML:

<?xml version="1.0" encoding="utf-8"?>
<Document>
    <DocumentInfo>
        <Created>2016-05-23T13:19:41.0528572Z</Created>
        <ExportSetting>None</ExportSetting>
        <InstalledProducts>
            <Product>
                <DisplayName>Some display name</DisplayName>
                <DisplayVersion>Some display version</DisplayVersion>
            </Product>
            <OptionPackage>
                <DisplayName>Some display name</DisplayName>
                <DisplayVersion>Some display version</DisplayVersion>
            </OptionPackage>
            <Product>
                <DisplayName>Some display name</DisplayName>
                <DisplayVersion>Some display version</DisplayVersion>
            </Product>
            <OptionPackage>
                <DisplayName>Some display name</DisplayName>
                <DisplayVersion>Some display version</DisplayVersion>
            </OptionPackage>
            <Product>
                <DisplayName>Some display name</DisplayName>
                <DisplayVersion>Some display version</DisplayVersion>
            </Product>
        </InstalledProducts>
    </DocumentInfo>
    <Some.Block ID="0">
    <AttributeList>
    <Interface>
    <Sections xmlns="http://www.somenamespace.com">
        <Section Name="Input">
        <Member Name="Member name 1" Datatype="Bool" />
        <Member Name="Member name 2" Datatype="Int" />
        <Member Name="Member name 3" Datatype="Int" />
        </Section>

获取显示名称元素等没有问题,因为这似乎是正常的xml代码,但第二部分相当困难。

我想仅提取属性名称为“Input”的Section的成员属性'Name和'Datatype'的值。

我用XMLPath,getNodebytagname等尝试了很多东西等等。

试过这个:

xmlnode = doc.GetElementsByTagName("Sections");
for (i = 0; i <= xmlnode.Count - 1; i++)
{
    xmlnode[i].ChildNodes.Item(0).InnerText.Trim();
    str = xmlnode[i].ChildNodes.Item(0).InnerText.Trim() + "  " + xmlnode[i].ChildNodes.Item(1).InnerText.Trim() + "  " + xmlnode[i].ChildNodes.Item(2).InnerText.Trim();
    MessageBox.Show(str);
}

并尝试了这个:

//XmlNodeList elemList = doc.GetElementsByTagName("Section[@Name='Input']");
//for (int x = 0; x < elemList.Count; x++)
//{
//    string attrVal = elemList[x].Attributes["Interface"].Value;
//}

到目前为止,没有任何工作,代码似乎无法超越名称空间的部分。有没有人有想法?

1 个答案:

答案 0 :(得分:2)

这样做:

XmlNodeList nodes = doc.GetElementsByTagName("Section");

Dictionary<string, string> list = new Dictionary<string, string>();
foreach (XmlNode node in nodes)
{
    if (node.Attributes != null && node.Attributes["Name"] != null && node.Attributes["Name"].Value == "Input")
    {
        foreach (XmlNode childNode in node.ChildNodes)
        {
            if (childNode.Attributes != null)
                list.Add(childNode.Attributes["Name"].Value, childNode.Attributes["Datatype"].Value);
        }
    }
}

您将拥有格式<Name, Datatype>

的字典