2009-02-26 32 views
1

İlk C# programlarından birini yazıyorum. (Bir özelliği değiştirmek XML ağacının bir parçası için bir XML belgeyiXML belgesindeki öznitelikleri ayarlama

  • açın
  • Şuraya ve her <myType> öğesi için tip <myType>
  • tüm alt öğelerini seçmek: İşte benim yapmaya çalıştığım şey de bu böylece <myType id="oldValue">.

<myType id="newValue">

  • Yaz bir dosyaya bu değiştirilmiş XML belgesi olacak ben XmlDocument.SelectNodes bulundu yöntemi, bir XPath ifadesini argümanı olarak alır. Ancak, bir XmlNodeList döndürür. XML düğümü ve XML öğesi arasındaki fark hakkında biraz bilgi okudum ve bunun neden XmlNode.SetAttribute yönteminin olmadığını açıkladığı görülüyor. Ama ben bu liste aracılığıyla döngü ve her biri için id öznitelikleri ayarlamak için XmlElement nesnelerin bir listesini almak için XPath ifademi kullanmanın bir yolu var mı?

    (diğer bazı kolay yolu varsa, bana bildirin lütfen.)

  • cevap

    2

    Basitçe - Bir eleman ya da niteliği okuduğunuz eğer bilmiyor. Bir XmlElement olarak SelectNodes bir XmlNodeList döndüren

    foreach(XmlElement el in doc.SelectNodes(...)) { 
        el.SetAttribute(...); 
    } 
    

    ancak yukarıdaki davranır her: Büyük olasılıkla, tek ihtiyacınız burada atıldı.

    +0

    Bu, gayet güzel çalışıyor. Ve genellikle güvenli, çünkü birden fazla düğüm türü döndüren bir XPath sorgusu yazmak istiyorsanız, üzerinde çalışmak zorundasınız. –

    +0

    @Robert - bir özellik veya metin düğümü olabilir; xpath oldukça benzer olurdu ... ama bu durumda OP okuma öğelerini okur; * Bu, onu güvenli kılan şeydir. –

    0

    benim Mac oturuyorum bu yüzden benim için NET ...

    Ancak, ben size açık bir döküm yoluyla bir XmlElement bir XmlNode döküm düşünüyorum.

    XmlElement öğesini bir XmlNode'a atayabilmeniz ve XmlNode.ChildNodes gibi bir şey kullanarak çocuk düğümlerini alabilmeniz gerekir.

    1

    Ben System.Xml.Linq.XDocument ve sağladığı özellikleri büyük bir hayranıyım.

    XDocument xDoc = XDocument.Load("FILENAME.xml"); 
    
    // assuming you types is the parent and mytype is a bunch of nodes underneath 
    IEnumerable<XElement> elements = xdoc.Element("types").Elements("myType"); 
    
    foreach (XElement type in elements) 
    { 
        // option 1 
        type.Attribute("id").Value = NEWVALUE; 
        // option 2 
        type.SetAttributeValue("id", NEWVALUE); 
    } 
    

    Seçenek 1 veya 2 çalışır, ancak 2'yi tercih ederim, çünkü öznitelik yoksa bu onu oluşturur.

    +0

    Teşekkürler; Bunu kontrol edeceğim. Çok kullanışlı görünüyor. – RexE

    İlgili konular