1

我有一个脚本可以使用 InnerText 将 xml 加载/读取到 15 个 texboxes

这是代码。

doc = new XmlDocument();
doc.Load(dlgOpenFile.FileName);
root = doc.DocumentElement;
txt1.Text = root.GetElementsByTagName("Seksi")[0].InnerText;
txt2.Text = root.GetElementsByTagName("Kota")[0].InnerText;
txt3.Text = root.GetElementsByTagName("Tanggal")[0].InnerText;
txt4.Text = root.GetElementsByTagName("NoIntelejen")[0].InnerText;
txt5.Text = root.GetElementsByTagName("Peta")[0].InnerText;
txt6.Text = root.GetElementsByTagName("Kedar")[0].InnerText;
txt7.Text = root.GetElementsByTagName("Tahun")[0].InnerText;
txt8.Text = root.GetElementsByTagName("Lembar")[0].InnerText;
txt9.Text = root.GetElementsByTagName("TugasPokok")[0].InnerText;
txt10.Text = root.GetElementsByTagName("Intelejen")[0].InnerText;
txt11.Text = root.GetElementsByTagName("Taktis")[0].InnerText;
txt12.Text = root.GetElementsByTagName("Personil")[0].InnerText;
txt13.Text = root.GetElementsByTagName("Logistik")[0].InnerText;
txt14.Text = root.GetElementsByTagName("Teritorial")[0].InnerText;
txt15.Text = root.GetElementsByTagName("Perhubungan")[0].InnerText;

当我加载正确的 xml 时,xml 成功加载到文本框,但是当GetElementsByTagName不匹配时,显示错误“对象引用未设置为对象的实例。”

在排队

txt10.Text = root.GetElementsByTagName("Intelejen")[0].InnerText;

如何检查是否GetElementsByTagName不匹配,所以当元素不匹配时,应用程序显示消息并取消加载?

4

6 回答 6

3

GetElementsByTagName方法将返回所有匹配元素的节点集合,如果没有找到匹配项,则返回一个空集合。您可以使用该Count属性测试集合是否为空。这就是你需要的:

var matches = root.GetElementsByTagName("Seksi");
if(matches.Count > 0)
    txt1.Text = matches[0].InnerText;

当您多次这样做时,创建一个辅助函数会很有用。像这样:

public void SetTextForTag(XmlElement root, TextBox tb, string tag)
{
    var matches = root.GetElementsByTagName(tag);
    if(matches.Count > 0)
        tb.Text = matches[0].InnerText;
}

您可以像这样使用它,例如:

SetTextForTag(root, txt1, "Seksi");
SetTextForTag(root, txt2, "Kota");
//and so on...
于 2013-11-04T10:17:59.057 回答
0

你可以通过使用这个扩展方法来干掉你的代码

public static bool TryGetInnerText(this XmlElement root, string childName, out string text)
    {
         var children = root.GetElementsByTagName(childName);
         if(children.Count > 0){
               text = children[0].InnerText;
               return true;
         }
         text = null;
         return false;
    }

那么你可以这样称呼它:

 if(!root.TryGetInnerText("Seksi", out txt1.Text)){
      //notify the uesr that the Seksi wasn't found
 }      

这也将为您处理支票

于 2013-11-04T12:05:06.740 回答
0

为什么不使用三元运算符,例如:

   txt1.Text = root.GetElementsByTagName("Seksi").Count < 1 ? "" : root.GetElementsByTagName("Seksi")[0].InnerText;
于 2013-11-04T10:18:48.567 回答
-1

尝试这个:

var element = root.GetElementsByTagName("Intelejen")[0];
if (element != null)
    txt10.Text = element.InnerText

说明:root.GetElementsByTagName("Intelejen")[0]如果没有找到任何元素,则返回 null。这就是为什么InnerText抛出一个空异常

于 2013-11-04T10:11:21.890 回答
-2
var elements = root.Elements("Seksi");
        if (elements.Any())
        {
            string txt = elements.First().Value;
        }
于 2013-11-04T10:25:29.677 回答
-2

记住对不存在的元素进行空检查,你不能分配不存在的东西:

txt1.Text = (root.GetElementsByTagName("Seksi")[0] != null) 
   ? root.GetElementsByTagName("Seksi")[0].InnerText 
   : String.Empty;
于 2013-11-04T10:12:59.503 回答