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 リストに 2 人称がないことです。したがって、 middleNameNodeList は 2 つの値 (K. と X.) を返しますが、1 人目、2 人目、3 人目のミドルネームが欠落しているかどうかはわかりません。

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

名前のリストを取得する代わりに、 のリストpersonを取得してから、リストを繰り返して名前を取得します。

于 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 に答える