2010-06-09 15 views
11

Estoy analizando un documento xml, necesito averiguar el valor de gid (un atributo) (3810).¿Cómo obtener el valor del atributo con SelectSingleNode?

Basado en SelectSingleNode(). Descubrí que no es fácil encontrar el nombre del atributo y su valor.

¿Puedo utilizar este método o debo cambiar a otra forma?

Se adjunta mi código.

¿Cómo puedo usar book obj para obtener el valor de atributo 3810 para gid. Gracias.

Mi archivo test.xml como a continuación

<?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> 

me escribió las test.cs como a continuación

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); 
    } 
} 

[Actualización 06/10/2010]

  1. el XML archivo es un archivo complejo. Incluido miles de gids. Pero para cada uno de Xpath, el gid es único.

  2. Cargo el archivo xml a un control TreeView. this.treeView1.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterSelect);. Cuando ocurra el evento treeView1_AfterSelect, el e.Node.FullPath volverá como un valor de cadena.

  3. Analizo la cadena Valor e.Node.FullPath. Luego obtuve el miembro de XPath Above. Luego traté de encontrar qué elemento de Gid se seleccionó.

Necesito encontrar el valor de gid como un valor de retorno de hecho.

Respuesta

4

Se pueden realizar consultas no XmlDocumentDocumentRoot:

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

Teniendo en cuenta el código en la pregunta 'book.Attributes' está vacía (Count = 0). – ChrisF

+0

Hola. De 'book.Attributes.Count = 0', no puede encontrar el' gid' durante el tiempo de ejecución. –

+0

En realidad, hay miles de gids en mi archivo xml real. Me gustaría analizar la capa de elemento con 'selectSingleNode()'. Creo que es un método rápido para mi caso. Entonces puedo encontrar el único gid. –

8

Puede escribir

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

Alternativamente, expanda el XPath para buscar el atributo, por ejemplo,

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

Si el @gid es único, entonces usted puede simplemente usar el XPath

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

Para buscar el nodo deseado con el identificador dado. Pero tenga en cuenta que cada solicitud buscará en todo el documento. Será más eficiente buscar todos los nodos y luego ponerlos en un mapa, con la tecla de identificación.

"//AttrObj[@gid]" 

Uso XmlNode.SelectNodes a buscar una lista de todos AttrObj con un atributo @gid.

+0

Dado el código en el libro de preguntas. Los atributos están vacíos (Count = 0). – ChrisF

+0

por cierto, lanzará 'NullReferenceException' en caso de que no se encuentre – abatishchev

+0

@mdma, probé' book = root.SelectSingleNode ("Attributes [AttrDir [@ name = 'EFEM']/AttrDir [@ name = 'Aligner']/AttrDir [@ name = 'SequenceID']/AttrObj [@ text = 'Slot01']/@ gid] ");'. el libro obj funciona bien pero Error del compilador para 'XmlAttribute gidAttribute = book.Attributes.GetNamedItem (" gid ");': * error CS0266: No se puede convertir implícitamente el tipo 'System.Xml.XmlNode' a 'System.Xml.XmlAttribute'. Existe una conversión explícita (¿falta un molde?) * –

0

El problema aquí es que su XPath estaba mal.Tenías esto:

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

que seleccionar o no seleccionar el elemento de atributos dependiendo de si todos los nombres emparejados. Este XPath debe tomar directamente a la GID atributo que desea:

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