4

答えを探していて、何も見つかりません-私はまったく新しいので、正しいキーワードを打っていないのではないでしょうか?

これは私が使用しているXMLのサンプルです

<database>
<book>
<title>A</title>
<author>
  <name>1</name>
</author>
</book>
<book>
<title>B</title>
<author>
  <name>2</name>
</author>
<author>
  <name>3</name>
</author>
<author>
  <name>4</name>
</author>
<author>
  <name>5</name>
</author>
</book>
</database>

C#XMLDocumentを使用して、本Aの著者1を取得し、次に本Bの著者1、2、3、4、5を取得しようとしています。

これまでのところ、私が使用しているコードはすべての著者を循環しているので、本Aの著者1、2、3、4、5を取得しています。

私がこれまでに持っているコードは大まかに次のとおりです

XmlDocument doc = new XmlDocument();
doc.Load("myxmlfile");
XmlNode root = doc.SelectSingleNode("database");
XmlNodeList nodelist = root.SelectNodes("book");

foreach (XmlNode n in nodelist)
        {

XmlNodeList authors = root.SelectNodes(".//author");
book.authorstring = "";
foreach (XmlNode author in authors)
       {
       book.authorstring = book.authorstring+author.SelectSingleNode("name").InnerText + ", ";
       }
}

「//」の前に「。」を使用すると、現在のノードに「アンカー」されるが、機能していないようで、すべてのノードを循環しているところをいくつか読んだ。

私は何を間違っているか、行方不明にしていますか?

4

3 に答える 3

7

私があなたを正しく理解しているなら、あなたのエラーはこの行にあります:

XmlNodeList authors = root.SelectNodes(".//author");

そのはず

XmlNodeList authors = n.SelectNodes(".//author");
于 2012-10-26T05:50:29.467 に答える
2

将来の読者のために、私はこの記事に出くわし.、xPathにを追加するのを忘れていました。

つまり(これはPowerShellでしたが、それは問題ではありません)、

これは間違っていて、ルートノードから見つかった最初のノードを返しました。

$descriptionNode = $someNode.SelectSingleNode("//Description")

そして、これは正しく、ノードの子として最初のノードを返しました。

$descriptionNode = $someNode.SelectSingleNode(".//Description")

もちろん、これは//どこでも./クエリを実行し、比較的クエリを実行するためです。かなり明確な説明ですが、見落としがちで、見つけるのに時間がかかりました。

便利なチートシート: https://devhints.io/xpath

于 2021-01-13T15:10:46.047 に答える
1

linq2XMLを使用します。使い方は簡単です。

XElement doc=XElement.Load("yourXML.xml");

var lstBooks=doc.Descendants("book").Select(x=>
new
{
    name=x.Element("title").Value,
    authors=x.Elements("author").Select(y=>y.Element("name").Value)
}
);

lstBooksこれで、必要なすべてのデータが含まれます

あなたは今これを行うことができます

foreach(var book in lstBooks)
{
book.name;//Name of the book
    foreach(var author in book)
    {
        author;//name of the author
    }
}
于 2012-10-26T06:29:04.580 に答える