Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C语言中解析可选标记#_C#_Tags_Optional_Selectnodes - Fatal编程技术网

C# 在C语言中解析可选标记#

C# 在C语言中解析可选标记#,c#,tags,optional,selectnodes,C#,Tags,Optional,Selectnodes,我正试图找到一种简单而巧妙的方法来满足以下要求 我有一条这样安排的XML消息: <persons> <person> <firstName>Mike</firstName> <middleName>K.</middleName> <lastName>Kelly</lastName> </person> <perso

我正试图找到一种简单而巧妙的方法来满足以下要求

我有一条这样安排的XML消息:

  <persons>
    <person>
       <firstName>Mike</firstName>
       <middleName>K.</middleName>
       <lastName>Kelly</lastName>
    </person>
    <person>
       <firstName>Steve</firstName>
       <lastName>David</lastName>
    </person>
    <person>
       <firstName>Laura</firstName>
       <middleName>X.</middleName>
       <lastName>Xavier</lastName>
    </person>
  </persons>
我的目标是将类似这样的firstName、middleName和lastName标记值存储到字符串对象列表中,如下所示:

firstNameList[0] = "Mike";
firstNameList[1] = "Steve";
firstNameList[2] = "Laura";

middleNameList[0] = "K.";
middleNameList[1] = null;
middleNameList[2] = "X.";

lastNameList[0] = "Kelly";
lastNameList[1] = "David";
lastNameList[2] = "Xavier";
在我的C#代码中,我执行以下操作:

XmlNodeList firstNameNodeList = xmlDoc.SelectNodes("persons/person/firstName", nsmgr);
XmlNodeList middleNameNodeList = xmlDoc.SelectNodes("persons/person/middleName", nsmgr);
XmlNodeList lastNameNodeList = xmlDoc.SelectNodes("persons/person/lastName", nsmgr);
这段代码的问题是,对于中间名,我的XML列表中的第二个人没有中间名。因此,middleNameNodeList返回2个值(K和X),但我不知道是否缺少第一、第二或第三个人的中间名

我希望SelectNodes()API能够提供一个迭代或索引ID,作为哪个重复元素具有给定值


请给我一个最简单的方法来实现我的需要?非常感谢您的帮助,JK

获取姓名列表,尝试获取
人的列表,然后迭代列表并获取他们的姓名。

获取姓名列表,尝试获取
人的列表,然后迭代列表并获取他们的姓名。

您只需迭代
persons/person
,然后分别处理每个人-这将起作用:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(@"test.xml");
var persons = xmlDoc.SelectNodes("persons/person");
foreach (XmlNode person in persons)
{
    string firstName = person.SelectSingleNode("firstName").InnerText;
    string middleName = (person.SelectSingleNode("middleName") != null) 
                        ? person.SelectSingleNode("middleName").InnerText 
                        : null;
    string lastName = person.SelectSingleNode("lastName").InnerText;
}

您只需迭代
persons/person
,并分别处理每个人-这将起作用:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(@"test.xml");
var persons = xmlDoc.SelectNodes("persons/person");
foreach (XmlNode person in persons)
{
    string firstName = person.SelectSingleNode("firstName").InnerText;
    string middleName = (person.SelectSingleNode("middleName") != null) 
                        ? person.SelectSingleNode("middleName").InnerText 
                        : null;
    string lastName = person.SelectSingleNode("lastName").InnerText;
}
这个怎么样

foreach (Node person in xmlDoc.SelectNodes("persons/person", nsmgr))
{
    firstNameNodeList.Add(person.SelectSingleNode("firstName", nsmgr));
    middleNameNodeList.Add(person.SelectSingleNode("middleName", nsmgr));
    lastNameNodeList.Add(person.SelectSingleNode("lastName", nsmgr));
}
这个怎么样

foreach (Node person in xmlDoc.SelectNodes("persons/person", nsmgr))
{
    firstNameNodeList.Add(person.SelectSingleNode("firstName", nsmgr));
    middleNameNodeList.Add(person.SelectSingleNode("middleName", nsmgr));
    lastNameNodeList.Add(person.SelectSingleNode("lastName", nsmgr));
}
试一试


迈克
K
凯莉
史蒂夫
大卫
劳拉
十,。
泽维尔
史蒂夫
大卫
对于
innertext

Try,应该返回“K”、“X”


迈克
K
凯莉
史蒂夫
大卫
劳拉
十,。
泽维尔
史蒂夫
大卫

对于没有中间名的人,可以使用吗?@StackOverflowException,这是一个好主意。在这种情况下,本例中SelectNodes()会返回3个值吗?K.,null和X。?我需要试验一下。是的。第二个中间名不会为空,但
XmlNodeList
InnerXml
将为空。看我的答案:)这一定是一个碎片吗?XmlSerializer和声明的类型能为您工作吗?能为没有中间名的人工作吗?@StackOverflowException,这是个好主意。在这种情况下,本例中SelectNodes()会返回3个值吗?K.,null和X。?我需要试验一下。是的。第二个中间名不会为空,但
XmlNodeList
InnerXml
将为空。看我的答案:)这一定是一个碎片吗?XmlSerializer和声明的类型可以为您工作吗?我只是给出了示例XML来解释这一点,但是在我的实际系统中,我会得到一个复杂的重复标记元素,其中预先定义了XPath。所以我不知道单个标记名,只知道XPath表达式。我想要尽可能的通用。还有其他想法吗?@JKK:没有人能保证节点列表是有序的。你不能假设,比方说,所有节点列表中的第三个元素都属于同一个“人”。Jollymorphic给出的上述答案是正确的。我只是给出了示例XML来解释这一点,但是在我的实际系统中,我会得到一个复杂的重复标记元素,其中预先定义了XPath。所以我不知道单个标记名,只知道XPath表达式。我想要尽可能的通用。还有其他想法吗?@JKK:没有人能保证节点列表是有序的。你不能假设,比方说,所有节点列表中的第三个元素都属于同一个“人”。因此,Jollymorphic的上述答案是正确的。