webentwicklung-frage-antwort-db.com.de

Wie erhalte ich einen Attributwert mit SelectSingleNode?

Ich analysiere ein XML-Dokument und muss den gid-Wert (ein Attribut) (3810) herausfinden.

Basierend auf SelectSingleNode(). Ich fand es nicht leicht, den Attributnamen und seinen Wert zu finden.

Kann ich diese Methode verwenden oder muss ich auf eine andere Art wechseln?.

Anbei ist mein Code.

Wie kann ich book obj verwenden, um das Attribut value3810 für gid zu erhalten. Vielen Dank.

Meine test.xml-Datei wie unten

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

Ich schrieb die test.cs wie folgt

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

[Update 10.06.2010]

  1. Die XML-Datei ist eine komplexe Datei. Tausende von Gids enthalten. Aber für jeden von Xpath ist die GID einzigartig.

  2. Ich lade die XML-Datei in ein TreeView-Steuerelement. this.treeView1.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterSelect);. Bei treeView1_AfterSelect-Ereignissen wird e.Node.FullPath als String-Wert zurückgegeben.

  3. Ich analysiere den String Value e.Node.FullPath. Dann bekam ich das Mitglied von XPath Above. Dann habe ich versucht herauszufinden, welches GID-Element ausgewählt wurde.

Ich muss den gid-Wert tatsächlich als Rückgabewert finden.

12
Nano HE

Du kannst schreiben

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

Erweitern Sie alternativ den Xpath, um das Attribut abzurufen, z.

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

Wenn das @ gid eindeutig ist, können Sie einfach den Xpath verwenden

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

Um den gewünschten Knoten mit der angegebenen ID abzurufen. Beachten Sie jedoch, dass jede Anforderung das gesamte Dokument durchsucht. Es ist effizienter, alle Knoten abzurufen und sie dann in eine Map einzugeben, die über die ID eingegeben wird.

"//AttrObj[@gid]"

Verwenden Sie XmlNode.SelectNodes, um eine Liste aller AttrObj mit einem @ gid-Attribut abzurufen.

8
mdma

Sie können XmlDocument selbst nicht DocumentRoot abfragen:

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

Das Problem hier war, dass Ihr XPath alles falsch war. Sie hatten folgendes:

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

dies würde entweder das Attributes-Element auswählen oder nicht auswählen, abhängig davon, ob alle Namen übereinstimmen. Dieser XPath sollte Sie direkt zum gewünschten gid-Attribut führen:

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