SORU
27 EKİM 2008, PAZARTESİ


Nasıl XmlNode örneği xpath almak için

Birileri bir Sistem xpath için bazı kod kaynağı olabilir.Xml.Örnek XmlNode?

Teşekkürler!

CEVAP
27 EKİM 2008, PAZARTESİ


Tamam, bir daha dene olması dayanamadım. Sadece özellikleri ve unsurları, ama hey... sen 15 dakika içinde ne beklenebilir ki :) işe yarar çok iyi yapmak için daha temiz bir yol olabilir Aynı şekilde.

Gereksiz her eleman (özellikle kök) dizin vardır. ama başka herhangi bir belirsizlik yok olsun çalışmak çok daha kolay.

using System;
using System.Text;
using System.Xml;

class Test
{
    static void Main()
    {
        string xml = @"
<root>
  <foo />
  <foo>
     <bar attr='value'/>
     <bar other='va' />
  </foo>
  <foo><bar /></foo>
</root>";
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(xml);
        XmlNode node = doc.SelectSingleNode("//@attr");
        Console.WriteLine(FindXPath(node));
        Console.WriteLine(doc.SelectSingleNode(FindXPath(node)) == node);
    }

    static string FindXPath(XmlNode node)
    {
        StringBuilder builder = new StringBuilder();
        while (node != null)
        {
            switch (node.NodeType)
            {
                case XmlNodeType.Attribute:
                    builder.Insert(0, "/@"   node.Name);
                    node = ((XmlAttribute) node).OwnerElement;
                    break;
                case XmlNodeType.Element:
                    int index = FindElementIndex((XmlElement) node);
                    builder.Insert(0, "/"   node.Name   "["   index   "]");
                    node = node.ParentNode;
                    break;
                case XmlNodeType.Document:
                    return builder.ToString();
                default:
                    throw new ArgumentException("Only elements and attributes are supported");
            }
        }
        throw new ArgumentException("Node was not in a document");
    }

    static int FindElementIndex(XmlElement element)
    {
        XmlNode parentNode = element.ParentNode;
        if (parentNode is XmlDocument)
        {
            return 1;
        }
        XmlElement parent = (XmlElement) parentNode;
        int index = 1;
        foreach (XmlNode candidate in parent.ChildNodes)
        {
            if (candidate is XmlElement && candidate.Name == element.Name)
            {
                if (candidate == element)
                {
                    return index;
                }
                index  ;
            }
        }
        throw new ArgumentException("Couldn't find element within parent");
    }
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • engineerguy

    engineerguy

    10 Ocak 2010
  • Greater Than Gatsby Photoshop Actions & Lightroom Presets

    Greater Than

    11 ŞUBAT 2013
  • Missouri Star Quilt Company

    Missouri Sta

    18 ŞUBAT 2009