2017-12-03 51 views
-1

這是我的要求: 編寫一個程序,接受XML輸入字符串並從中獲取所有節點值。使用命名空間System.XML(不要使用System.XML.Linq)。程序接受一個XML輸入字符串,並從中獲取所有節點值3.

Display &節點值由空格分隔。

例子:如果輸入字符串包含以下字符串:

<Names> <Name> <FirstName>John</FirstName> <LastName>Smith</LastName</Name> 
<Name><FirstName>James</FirstName> <LastName>White</LastName></Name></Names> 

顯示輸出: 約翰·史密斯詹姆斯·懷特

創建一個類名爲UserProgramCode具有以下靜態方法 公共靜態字符串getnodeByName(字符串輸入1) 創建一個名爲Program的類,它接受輸入並調用UserProgramCode中存在的靜態方法。

而我的代碼是

using System;使用System.Xml的 ;

public class Program{ 

    public static void Main(){ 

    string xmlinput=Console.ReadLine(); 
    UserProgramCode.getnodeByName(xmlinput); 
    } 

} 

public class UserProgramCode{ 

    static string ResultName; 
    public static string getnodeByName(string input1) 
    { 

     XmlDocument xmlDoc = new XmlDocument(); 
     xmlDoc.LoadXml(input1); 
     string xpath ="Names/Name"; 
     var nodes = xmlDoc.SelectNodes(xpath); 
     foreach (XmlNode childrenNode in nodes) 
     { 
       UserProgramCode.ResultName=childrenNode.SelectSingleNode("/FirstName").InnerText +" "+ childrenNode.SelectSingleNode("/LastName").InnerText; 
     } 
     return UserProgramCode.ResultName; 
    } 
} 

但我得到空引用Exception.I不知道如何解決這個問題。請幫忙 。我是C#.net的新手。

約翰·史密斯詹姆斯懷特 未處理的異常: System.NullReferenceException:0 在程序:對象沒有在UserProgramCode.getnodeByName(System.String輸入1)[0x00000]在設置到對象 的一個實例。 Main()[0x00000] in:0 [ERROR] FATAL UNHANDLED EXCEPTION:System.NullReferenceException:對象引用未設置爲對象實例 UserProgramCode.getnodeByName(System.String input1)[0x00000] in:0 at Program.Main()[0x00000] in:0

+0

我猜空引用異常是因爲'的SelectSingleNode()'將返回空值,如果確實如此,試圖訪問'.InnerText'將導致此錯誤。如果你使用'?.InnerText',你可以防止它崩潰你的程序,但在你的情況下,你需要弄清楚爲什麼'SelectSingleNode()'返回null。提示:XPath開始處的'/'的行爲與文件系統路徑的行爲類似。 –

+0

有兩個問題:1)在姓氏後面缺少'>'。 2)在路徑中需要一段時間:UserProgramCode.ResultName = childrenNode.SelectSingleNode(「./ FirstName」)。InnerText +「」+ childrenNode.SelectSingleNode(「./ LastName」)。InnerText; – jdweng

+0

[什麼是NullReferenceException,我該如何解決它?]的可能重複(https://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it ) – Progman

回答

0

我在這裏看到多個問題:

  1. 你輸入XML的格式不正確。您應該嘗試捕獲,而LoadXml作爲用戶可以輸入任何內容來破壞您的代碼。 Smith</LastName>」已丟失。

  2. /前面的節點名稱/FirstName將使它從當前節點的根開始搜索。

  3. 指定給ResultName只會保留最後一個節點的名和姓,並放棄所有其他節點。

  4. 使用字符串連接會導致浪費的堆。

  5. 命名約定與C#標準不匹配。

更新的樣本:

public class UserProgramCode 
    { 
    static StringBuilder resultName = new StringBuilder(); 
    public static string GetNodeByName(string input1) 
    { 
     XmlDocument xmlDoc = new XmlDocument(); 
     try 
     { 
      xmlDoc.LoadXml(input1); 
     } 
     catch (XmlException xe) 
     { 
      Console.WriteLine("Input XML is not parseable. " + xe.Message); 
     } 
     string xpath = "Names/Name"; 
     var nodes = xmlDoc.SelectNodes(xpath); 
     foreach (XmlNode childrenNode in nodes) 
     { 
      resultName.AppendLine(childrenNode.SelectSingleNode("FirstName").InnerText + " " + childrenNode.SelectSingleNode("LastName").InnerText); 
     } 
     return resultName.ToString(); 
    } 
    } 
+0

非常感謝Sunil。你工作得很好! –

相關問題