2017-12-03 53 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。你工作得很好! –

相关问题