0

HTML をHTMLdocumentにロードしました。ここで、 dtに属するすべてのddで各dtにアクセス/選択し、後で使用するために配列に格納したいと考えています。http://www.w3schools.com/xsl/xpath_axes.aspに記載されている XPath 構文を既に試しましたが、まったく機能しませんでした。を受け取りました。しかし、私は何を間違っていますか?NullReferenceException

1 つの に対して2 つ以上の**dd**要素が存在する場合があることに注意してください**dt**。すべて**dd**の要素を対応する**dt**.

よろしくお願いします。

<dl>
  <dt id="one">one</dt>
  <dd>some text</dd>
  <dt id="two">two</dt>
  <dd>some text</dd>
  <dt id="three">three</dt>
  <dd>some text</dd>
  <dd>some text</dd>
  <dt id="four">four</dt>
  <dd>some text</dd>
  and so on...
</dl>
4

1 に答える 1

0

dt要素と要素の間に直接のリンクはありddません。そのため、個人的に XPath を使用して解決策を提供する方法を見つけられませんでした。XSLT も選択肢の 1 つかもしれませんが、XSLT を使用した迅速で簡単な方法も見つかりませんでした。あなたは C# を使っているので、これが C# でどのように見えるかの簡単なプロトタイプ関数を作成しました。

public static void Main(string[] args)
        {            
            Dictionary<string, List<string>> dt = new Dictionary<string, List<string>>();        

            using(XmlReader reader = XmlReader.Create(@"data.xml")){
                bool incomingDd = false;
                while(reader.Read()){
                    switch(reader.NodeType){
                        case XmlNodeType.Element:                            
                            if(String.Equals(reader.Name, "dt", StringComparison.OrdinalIgnoreCase)){
                                dt.Add(reader.GetAttribute("id"), new List<string>());
                            }
                            else if(String.Equals(reader.Name, "dd", StringComparison.OrdinalIgnoreCase)){
                                incomingDd = true;                                
                            }
                            break;

                        case XmlNodeType.Text:                                
                            if(incomingDd && !String.IsNullOrEmpty(reader.Value)){                                
                                dt.Values.ElementAt(dt.Count -1).Add(reader.Value);
                                incomingDd = false;
                            }
                            break;
                    }
                }
            }

            foreach(var item in dt){
                Console.WriteLine($"{item.Key} {item.Value.Count()}:");
                foreach(var dd in item.Value){
                    System.Console.WriteLine($"\t{dd}");
                }
            }
        }

これは、あなたのニーズに最も適したコードではないかもしれませんが、問題を解決する方法についてのアイデアが得られるはずです。

于 2016-09-19T14:36:43.610 に答える