2010-06-09 16 views
11

Sto analizzando un documento xml, ho bisogno di trovare il valore gid (un attributo) (3810).Come ottenere il valore dell'attributo utilizzando SelectSingleNode?

Basato su SelectSingleNode(). Ho trovato che non è facile trovare il nome dell'attributo e il suo valore.

Posso usare questo metodo o devo passare in un altro modo.

Allegato è il mio codice.

Come è possibile utilizzare book obj per ottenere il valore dell'attributo 3810 per gid. Grazie.

Il mio file test.xml come di seguito

<?xml version="1.0" ?> 
<root> 
    <VersionInfo date="2007-11-28" version="1.0.0.2" /> 
    <Attributes> 
     <AttrDir name="EFEM" DirID="1"> 
     <AttrDir name="Aligner" DirID="2"> 
      <AttrDir name="SequenceID" DirID="3"> 
       <AttrObj text="Slot01" gid="3810" unit="" scale="1" /> 
       <AttrObjCount value="1" /> 
      </AttrDir> 
     </AttrDir> 
     </AttrDir> 
    </Attributes> 
</root> 

ho scritto le Test.cs come di seguito

public class Sample 
{  
    public static void Main() 
    {  
     XmlDocument doc = new XmlDocument(); 
     doc.Load("test.xml"); 

     XmlNode book; 
     XmlNode root = doc.DocumentElement; 

     book = root.SelectSingleNode("Attributes[AttrDir[@name='EFEM']/AttrDir[@name='Aligner']/AttrDir[@name='SequenceID']/AttrObj[@text='Slot01']]"); 

     Console.WriteLine("Display the modified XML document...."); 
     doc.Save(Console.Out); 
    } 
} 

[Aggiornamento 06/10/2010]

  1. L'XML il file è un file complesso. Incluso migliaia di gid. Ma per ogni Xpath, il gid è unico.

  2. Carico il file xml in un controllo TreeView. this.treeView1.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterSelect);. Quando si è verificato l'evento treeView1_AfterSelect, lo e.Node.FullPath verrà restituito come valore stringa.

  3. I analizza la stringa Valore e.Node.FullPath. Poi ho ottenuto il membro di XPath Above. Poi ho provato a trovare quale elemento del gid è stato selezionato.

Ho bisogno di trovare il valore del gid come valore di ritorno.

risposta

4

È possibile interrogare non XmlDocument stessa DocumentRoot:

XmlDocument doc = new XmlDocument(); 
XmlNode book = doc.SelectSingleNode(".."); 
if (book != null) 
{ 
    XmlAttribute gid = book.Attributes["gid"]; 
    if (gid != null) 
    { 
     string value = gid.Value; 
    } 
} 
+0

Dato il codice nella domanda 'book.Attributes' è vuoto (Conteggio = 0). – ChrisF

+0

Ciao. Da 'book.Attributes.Count = 0', non è possibile trovare il' gid' durante il tempo di esecuzione. –

+0

Nel mio vero file xml, ci sono migliaia di gitar. Mi piacerebbe analizzare il livello dell'elemento con 'selectSingleNode()'. Penso che sia un metodo veloce per il mio caso. Quindi posso trovare il gid univoco. –

8

si può scrivere

XmlAttribute gidAttribute = (XmlAttribute)book.Attributes.GetNamedItem("gid"); 
String gidValue = null; 
if (gidAttribute!=null) 
    value = gidAttribute.Value; 

alternativa, espandere il Xpath per recuperare l'attributo, ad esempio

Attributes[AttrDir[@name='EFEM']/AttrDir[@name='Aligner']/AttrDir[@name='SequenceID']/AttrObj[@text='Slot01']]/@gid 

Se il @gid è unico, quindi si può semplicemente utilizzare il Xpath

"//AttrObj[@gid='3810']" 

Per recuperare il nodo desiderato con il dato id. Ma nota che ogni richiesta cercherà attraverso l'intero documento. Sarà più efficiente recuperare tutti i nodi e quindi inserirli in una mappa, digitata da id.

"//AttrObj[@gid]" 

Usa XmlNode.SelectNodes per andare a prendere una lista di tutti AttrObj con un attributo @gid.

+0

Dato il codice nel libro delle domande. Attributi è vuoto (Conteggio = 0). – ChrisF

+0

btw, getterà 'NullReferenceException' in caso di non trovato – abatishchev

+0

@mdma, ho provato' book = root.SelectSingleNode ("Attributi [AttrDir [@ name = 'EFEM']/AttrDir [@ name = 'Aligner']/AttrDir [@ name = 'SequenceID']/AttrObj [@ text = 'Slot01']/@ gid] ");'. il libro obj funziona bene. ma Errore del compilatore per 'XmlAttribute gidAttribute = book.Attributes.GetNamedItem (" gid ");': * errore CS0266: Impossibile convertire implicitamente il tipo 'System.Xml.XmlNode' in 'System.Xml.XmlAttribute'. Esiste una conversione esplicita (ti manca un cast?) * –

0

Il problema era che il tuo XPath era tutto sbagliato.Hai avuto questo:

Attributes[AttrDir[@name='EFEM']/AttrDir[@name='Aligner']/AttrDir[@name='SequenceID']/AttrObj[@text='Slot01']] 

che sia selezionare o non selezionare l'elemento Attributi a seconda che tutti i nomi abbinati. Questo XPath dovrebbe portarti direttamente all'attributo gid che desideri:

Attributes/AttrDir[@name='EFEM']/AttrDir[@name='Aligner']/AttrDir[@name='SequenceID']/AttrObj[@text='Slot01']/@gid 
Problemi correlati