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