XmlDocumentまたはXDocumentにxElementの名前を渡して絶対xpathを取得する方法は?

私はこのようなXMLファイルノード構造を持っています


    
    
    
        
        
    
    
        
            
            
        
        
            
            
        
        
            
            
        
    

このファイルから、XmlDocumentまたはXDocumentを使用して任意の要素名(XElementではない)のabsoulte xpathを取得したいとします。 どうやってするの?

2

2 答え

名前空間を持たない単純なXMLの場合、これを試してみてください:

public static string GetPath(XElement element)
{
    return string.Join("/", element.AncestorsAndSelf().Reverse()
        .Select(e =>
            {
                var index = GetIndex(e);

                if (index == 1)
                {
                    return e.Name.LocalName;
                }

                return string.Format("{0}[{1}]", e.Name.LocalName, GetIndex(e));
            }));

}

private static int GetIndex(XElement element)
{
    var i = 1;

    if (element.Parent == null)
    {
        return 1;
    }

    foreach (var e in element.Parent.Elements(element.Name.LocalName))
    {
        if (e == element)
        {
            break;
        }

        i++;
    }

    return i;
}
4
追加された
@NareshReddy、そしてその名前でXML要素を決定する方法は? XML文書では、同じ名前の要素がたくさんある可能性があります。
追加された 著者 Kirill Polishchuk,
@NareshReddy、とにかく最初の XElement をその名前で見つけ出し、私が提供した方法に渡すことができます。
追加された 著者 Kirill Polishchuk,
@NareshReddy、このコードを使用できます: var element = doc.Descendants(elemnetName).First(); 次に、提供されたメソッドに element を渡します。
追加された 著者 Kirill Polishchuk,
Kirill Polishchukさんからの返信ありがとうございました。上記のコードのメソッドにパラメータとしてXElement型変数を渡しましたが、 30000 のような値が入っていますが、私の場合は「Basic」のみをstringとして渡します。xElement名前は文字列ですか?
追加された 著者 User_MVC,
私は要素の名前を含むリストを持っています。そのリストを使用して、各name.ifに複数の要素がある場合は、最初の要素xpathを返します。
追加された 著者 User_MVC,
リストxml要素の名前を1つずつ渡してxmlノードの値を取得したいだけです。リストの値の順序はxmlファイルの構造と同じではありません。
追加された 著者 User_MVC,
Kirill Polishchukに感謝します。var element = doc.Descendants(elemnetName).First();を使用しました。
追加された 著者 User_MVC,

私は XDocument クラスの Descendants メソッドを使って達成しました:

XElement xElement = xDocument.Descendants("Basic").First();

ここに文字列として渡されたXML要素「Basic」

public void ConvertObjectToXml(Employee employee )
{
    MemoryStream Stream = new MemoryStream();
    //To remove the default xml name space
    XmlSerializerNamespaces XmlNS = new XmlSerializerNamespaces();
    XmlNS.Add("", "");
    XmlSerializer XmlSerializer = new XmlSerializer(employee .GetType());
    XmlSerializer.Serialize(Stream, employee , XmlNS);
    Stream.Flush();
    Stream.Seek(0, SeekOrigin.Begin);
    XDocument xDocument = XDocument.Load(Stream);
    //Paasing the "Basic" as string
    XElement xElement = xDocument.Descendants("Basic").First();
    string xpath = GetPath(xElement);
      //Paasing the "Course" as string
    XElement XElement1 =xDocument.Descendants("Course").First();
    string xpath1 = GetPath(XElement1);
}

public static string GetPath(XElement element)
{
    return string.Join("/", element.AncestorsAndSelf().Reverse()
        .Select(e => 
        {
            var index = GetIndex(e); 
            if (index == 1) 
            {
                return e.Name.LocalName; 
            }
            return string.Format("{0}[{1}]", e.Name.LocalName, GetIndex(e)); 
        })); 
} 

public static int GetIndex(XElement element) 
{
    var i = 1; 
    if (element.Parent == null) 
    {
        return 1; 
    }
    foreach (var e in element.Parent.Elements(element.Name.LocalName)) 
    {
        if (e == element)
        { 
            break; 
        }
        i++;
    }
    return i; 
} 
0
追加された