3

XML ファイルから要素を読み込もうとしています。「メタデータ」内の「リンク」要素の文字列を読み取る必要がありますが、「リンク」と呼ばれる要素が 2 つあります。必要なのは 2 番目の要素だけです。

<metadata>
<name>visit-2015-02-18.gpx</name>
<desc>February 18, 2015. Corn</desc>
<author>
    <name>text</name>
    <link href="http://snow.traceup.com/me?id=397760"/>
</author>
<link href="http://snow.traceup.com/stats/u?uId=397760&amp;vId=1196854"/>
<keywords>Trace, text</keywords>

この行を読む必要があります:

<link href="http://snow.traceup.com/stats/u?uId=397760&amp;vId=1196854"/>

これは最初の「リンク」タグの作業コードです。正常に動作します。

        public string GetID(string path)
    {
        string id = "";
        XmlReader reader = XmlReader.Create(path);
        while (reader.Read())
        {
            if ((reader.NodeType == XmlNodeType.Element) && (reader.Name == "link"))
            {
                    if (reader.HasAttributes)
                    {
                        id = reader.GetAttribute("href");
                        MessageBox.Show(id + "= first id");
                        return id;
                        //id = reader.ReadElementContentAsString();
                    }
                }
            }
            return id;
        }

最初の「リンク」要素をスキップする方法を知っている人はいますか? または、reader.ReadElementContentAsString() に「Vid」などが含まれているかどうかを確認しますか?

あなたが私を助けてくれることを願っています。

4

3 に答える 3

2

xpathが答えです:)

        XmlReader reader = XmlReader.Create(path);
        XmlDocument doc = new XmlDocument();
        doc.Load(reader);
        XmlNodeList nodes = doc.SelectNodes("metadata/link");
        foreach(XmlNode node in nodes)
             Console.WriteLine(node.Attributes["href"].Value);
于 2015-11-12T17:59:58.693 に答える
1

String.Contains メソッドを使用して、文字列に目的の部分文字列 (この場合) が含まれているかどうかを確認しますvId

public string GetID(string path)
{
    XmlReader reader = XmlReader.Create(path);
    while (reader.Read())
    {
        if ((reader.NodeType == XmlNodeType.Element) && (reader.Name == "link"))
        {
        if (reader.HasAttributes)
        {
            var id = reader.GetAttribute("href");
            if (id.Contains(@"&vId"))
            {
                MessageBox.Show(id + "= correct id");
                return id;
            }
        }
    }
    return String.Empty;
}

許容できる場合は、LINQ2XMLも使用できます。

var reader = XDocument.Load(path); // or XDocument.Parse(path);
// take the outer link
Console.WriteLine(reader.Root.Element("link").Attribute("href").Value);

出力は常に次のとおりです。

http://snow.traceup.com/stats/u?uId=397760&vId=1196854= first id

別のオプションは、@ user5507337 が提案したように XPath を使用することです。

于 2015-11-12T18:03:48.050 に答える
0

XDocument の例:

var xml = XDocument.Load(path); //assuming path points to file
var nodes = xml.Root.Elements("link");
foreach(var node in nodes)
{
    var href = node.Attribute("href").Value;
}
于 2015-11-12T18:17:37.027 に答える