1

我正在尝试从 XML 获取数据。我所知道的是,当我要查找的动物不在 XML 数据中时,我总是会出错。如图所示的一个例子。

这是存储在 XML 中的数据:

<?xml version="1.0" encoding="utf-8" ?>
<Root>
<Animal value="Elephant" size="2" name="Bob">
    <Action age="1" size="1">I am small</Action>
    <Action age="2" size="1">I am growing up</Action>
    <Action age="3" size="1">I'm 3 years old</Action>
    <Action age="4" size="1">I'm BIG</Action>
</Animal>
</Root>

这是 C# 编码的一部分:

XmlDocument xDoc = new XmlDocument();
xDoc.Load("animals.xml");
string animal = "Elephant";
MessageBox.Show(Convert.ToString(xDoc.SelectSingleNode("/Root/Animal[@value='" + animal + "']")
                                     .Attributes["name"].InnerText));

当我改变时发生错误

string animal = "Tiger";

如果数据不存在,如何解决错误?

4

3 回答 3

4

null您可以使用 Linq to Xml 获取动物的名称(如果未找到动物,它将返回):

XDocument xdoc = XDocument.Load("animals.xml");
string animal = "Elephant";

var name = xdoc.Root.Elements()
                .Where(a => (string)a.Attribute("value") == animal)
                .Select(a => (string)a.Attribute("name"))
                .FirstOrDefault();

您也可以简单地检查是否找到任何与您的值匹配的动物,并仅在匹配时获取名称:

var xpath = String.Format("Root/Animal[@value='{0}']", animal);
var animalElement = xdoc.XPathSelectElement(xpath);

if (animalElement != null)
    MessageBox.Show((string)animalElement.Attribute("name"));
于 2013-07-21T10:36:47.933 回答
2

您可以改为使用SelectNodesXmlNodeList然后检查其节点数。如果计数为零,则说“未找到节点”;否则,获取属性并打印它:

XmlDocument xDoc = new XmlDocument();
xDoc.Load("animals.xml");
string animal = "Tiger";
XmlNodeList theList = xDoc.SelectNodes("/Root/Animal[@value='" + animal + "']");
if (theList.Count == 1) {
    MessageBox.Show(Convert.ToString(theList[0].Attributes["value"].InnerText));
} else if (theList.Count == 0) {
    MessageBox.Show("No "+animal);
} else {
    MessageBox.Show("Multiple "+animal+"s");
}
于 2013-07-21T10:29:05.160 回答
0

就像是

var animalNode = xDoc.SelectSingleNode("/Root/Animal[@value='" + animal + "']");
if (animalNode != null)
{
  var valueAttr = animalNode.Attributes["value"];
  if (valueAttr != null)
  {  
     MessageBox.Show(valueAttr.InnerText); //.value ???
  }
}
于 2013-07-21T10:30:36.240 回答