0

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

我有这样安排的 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>

我想使用 xPath 表达式解析这个 XML。

persons/person/firstName
persons/person/middleName
persons/person/lastName

我的目标是将这样的 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

4

4 回答 4

2

这个怎么样?

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));
}
于 2011-03-05T02:54:12.953 回答
1

不要获取名称列表,而是尝试获取persons 列表,然后迭代列表并获取它们的名称。

于 2011-03-05T02:48:03.220 回答
0

您只需要迭代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;
}
于 2011-03-05T02:52:40.410 回答
0

尝试

   <persons>
    <person>
       <firstName>Mike</firstName>
       <middleName>K.</middleName>
       <lastName>Kelly</lastName>
    </person>
    <person>
       <firstName>Steve</firstName>
       <middleName /> 
       <lastName>David</lastName>
    </person>
    <person>
       <firstName>Laura</firstName>
       <middleName>X.</middleName>
       <lastName>Xavier</lastName>
    </person>
  </persons>

<person>
   <firstName>Steve</firstName>
   <middleName /> 
   <lastName>David</lastName>
</person>

这应该返回 "K","","X"InnnerText

于 2011-03-05T03:37:31.740 回答