构建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>
答案 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);
}
}