2010-06-07 33 views
0

Mon fichier XML est comme suit. Il a mélangé le schéma et les éléments normaux.Besoin d'aide sur l'utilisation de XPathNavigator en C#?

<?xml version="1.0" encoding="utf-8"?> 
<!-- R1 --> 
<ax:root xmlns:ax="http://amecn/software/realtime/ax"> 
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:element name="EquipmentConstants"> 
     <xsd:complexType> 
     <xsd:sequence> 
      <xsd:element minOccurs="0" maxOccurs="unbounded" ref="EquipmentConstant" /> 
     </xsd:sequence> 
     </xsd:complexType> 
     <xsd:unique name="id"> 
     <xsd:selector xpath=".//EquipmentConstant" /> 
     <xsd:field xpath="@id" /> 
     </xsd:unique> 
    </xsd:element> 
    ...... 
    ...... 
    </xsd:schema> 
    <EquipmentConstants xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <EquipmentConstant id="0"> 
     <Name>SerialNumber</Name> 
     <Group>SYSTEM</Group> 
     <Data> 
     <Value min="0" max="10000000" scale_factor="0" unit="U_NO_UNITS" permission="NolimitedAndNoChangeable" type="xsd_string" enum="" flag="0">0</Value> 
     </Data> 
     <Description>Serial Number</Description> 
    </EquipmentConstant> 
    ..... 
    ..... 
    </EquipmentConstants> 
</ax:root> 

Mon code C# comme ci-dessous. Je veux boucler les éléments de départ (par passer tout le contenu du schéma)

<EquipmentConstants xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

XPathDocument doc = new XPathDocument("test.xml"); 
       XPathNavigator navigator = doc.CreateNavigator(); 

       navigator.MoveToRoot(); // <?xml version="1.0" encoding="utf-8"?> 
       //navigator.MoveToFirstChild(); // <!-- R1 --> 
       // 1st, I tried to use MoveToChield(), But I failed to move there. 
       navigator.MoveToChild("EquipmentConstants"); 
       // Then, I also tried to use SelectSingleNode(). But I failed too. 
       navigator.SelectSingleNode("ax/EquipmentConstants"); 
       while (navigator.MoveToNext()) 
       { 
       // do something. 
       } 

Pourriez-vous s'il vous plaît me donner quelques suggestions. Je vous remercie.

Répondre

0

Ma solution comme ci-dessous.

  XPathDocument doc = new XPathDocument("test.xml"); 
      XPathNavigator navigator = doc.CreateNavigator(); 

      navigator.MoveToRoot(); // <?xml version="1.0" encoding="utf-8"?> 
      navigator.MoveToFirstChild(); // <!-- R1 --> 
      navigator.MoveToNext(); // <ax:root xmlns:ax="http://amecn/software/realtime/ax"> 
      navigator.MoveToChild("EquipmentConstants", ""); // <EquipmentConstants xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

      navigator.MoveToFirstChild(); // <EquipmentConstant id="0"> 
      do 
      { 
      // Loop body; 
      } while (navigator.MoveToNext()); 
1
 XPathNavigator navigator = doc.CreateNavigator(); 
     if (navigator == null) 
     { 
      return; 
     } 
     foreach (XPathNavigator nav in 
      navigator.Select("/" + "EquipmentConstants" + "/" + "EquipmentConstant")) 
     { 

     } 
+0

@Arseny, Bonjour, Il n'y a qu'un 'EquipmentConstants' dans mon fichier xml. Puis-je simplement ne pas utiliser foreach en fonction de votre code? –

+0

Je suppose que vous avez l'élément racine EquipmentConstants où est une liste d'enfants EquipmentConstant. si c'est juste mon code ci-dessus navigue via les nœuds enfants. – Arseny

+0

après 'navigator.MoveToRoot()', j'ai inséré votre code. J'ai trouvé que le code ne fonctionne pas. On dirait que select() ne peut pas fonctionner. la boucle 'foreach' n'entrera pas dans le bloc de' EquipmentConstants'. –