只有在某个节点中才能获取ElementsByTagName

时间:2016-05-03 00:42:24

标签: c# .net

构建Windows Form C#app。我正在尝试读取XML文件,并且特意尝试获取某些属性。我的代码如下:

XmlNodeList elemList = readXml.GetElementsByTagName("Function");
            MessageBox.Show(elemList.Count.ToString());
            for (int i = 0; i < elemList.Count; i++)
            {
               listBox1.Items.Add(elemList[i].Attributes["Name"].Value);
            }

此代码非常有用,除了标记稍后在文档中用作其他数据的子节点的问题,其中Name属性不存在,从而导致异常。我怎样才能使它只读取作为某个节点的子节点的函数标签?

编辑:

示例XML如下

这些是我想要抓住的东西

      <Function ID="2" Type="Collection" Name="Left/Right" Path="page 1">
       <Step Number="0">26</Step>
       <Step Number="1">29</Step>
       <Step Number="2">23</Step>
      </Function>

这是我不想抓住的其他东西的功能

    <Button Caption="page 2 program 6" ID="14" Icon="">
       <WindowState Visible="True" X="60" Y="60" Width="50" Height="50"/>
        <Appearance>
       <FrameStyle>None</FrameStyle>
        <ForegroundColor>Default</ForegroundColor>
       <BackgroundColor>Default</BackgroundColor>
        <BackgroundImage>None</BackgroundImage>
        <Font>Default</Font>
        </Appearance>
         <Function ID="13"/>
        <Action>Toggle</Action>
        <Intensity Adjust="False">100</Intensity>
       </Button>

2 个答案:

答案 0 :(得分:1)

您可以使用HasAttribute方法。它允许您检查特定属性的XML元素,然后您可以决定是否引用名称对象,从而防止异常。

编辑:

实际上,要使其更简单,请使用Name类中的XmlNode属性。检查是否为null,如果不为null,则仅添加到列表中。

for (int i = 0; i < elemList.Count; i++)
{
    if (elemList[i].Name != null)
    {
        listBox1.Items.Add(elemList[i].Attributes["Name"].Value);
    }
}

请告诉我这是否有帮助!

答案 1 :(得分:0)

为什么不使用简单Linq to Xml,效率更高。

XDocument doc = XDocument.Parse(input);     
var elements = doc.Descendants("Function")
                  .Where(x=>x.Attribute("Name") !=null);

所以你的代码应简化为

var values = doc.Descendants("Function")
                .Where(x=>x.Attribute("Name") !=null)
                .Select(x=> (string)x.Element("Name").Value);

listBox1.Items.AddRange(values);

或者,您可以通过 null 检查属性是否存在来修复代码。

for (int i = 0; i < elemList.Count; i++)
{
    if (elemList[i].Attributes != null
     && elemList[i].Attributes["Name"] != null)
    {
        listBox1.Items.Add(elemList[i].Attributes["Name"].Value);
    }
}