【问题标题】:How to get XML attributes in elements in C#如何在 C# 中获取元素中的 XML 属性
【发布时间】:2016-05-27 14:13:32
【问题描述】:

您好,我希望有人可以帮助我,我一直在努力在 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”的部分的成员属性“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;
//}

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

【问题讨论】:

  • xmlnode[i].ChildNodes.Item(0).Attribute("Attribute_Name").Value

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


【解决方案1】:

这样就可以了:

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

您将拥有&lt;Name, Datatype&gt; 格式的字典

【讨论】:

  • 在您的第一个if 条件中,您必须测试node.Attributes["Name"] != null,因为node.Attributes 永远不会为空...
猜你喜欢
  • 2021-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-07
  • 2017-12-23
  • 2021-03-09
  • 1970-01-01
相关资源
最近更新 更多