2

ノードのIDに基づいてHTMLページからノードを選択しようとしています。外部の制限により、XPathを使用してそれを行う必要があります。

フォーラムの投稿のコンテナ要素(この場合はDelphi-PRAXiS)を取得したいと思います。ページの簡単な例を添付しました。

必要なノードは「posts」というIDのdivなので、クエリは。になります//div[@id='posts']。問題は、結果が空のリストになることです。を使用してクエリを実行する//*[@id='posts']と、ノードが取得されます。

フレームワークのXmlDocumentクラスを使用してこれを試しました。

最終的には、Html Agility Pack(XmlDocumentと同じXPathクラスを使用)を使用したいのですが、これを使用すると、クエリ文字列に関係なく結果が得られません。

クエリ文字列が正しいことはわかっているので、パーサーに障害があると推測されます。しかし、どういうわけか、Microsoftが壊れたXPathパーサーを出荷するのではないかと思います。

助言がありますか?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="de">  
  <head>    
    <title>Some title</title>  
  </head>  

  <body>    
    <div>          
      <div class="page">                 
        <div id="dp-page" class="round-all">          
          <div class="dpbox">               
            <div id="posts">
              Here we go!               
            </div>            
          </div>            
        </div>          
      </div>        
    </div>  
  </body>
</html>

別の手がかりを見つけました。ノード<a name="poststop" id="poststop"></a>がxmlに存在する場合、クエリは失敗します。それ以外の場合は成功します。しかし、なぜ?

4

2 に答える 2

3

XHTML要素はhttp://www.w3.org/1999/xhtml名前空間にあるため、セレクターで指定する必要があります。コードは次のようになります(XDocument名前空間が関係する場合は、使用が少し簡単になります)。

var nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("xhtml", "http://www.w3.org/1999/xhtml");
var nodelist = doc.SelectNodes("//xhtml:div[@id='posts']", nsmgr);
于 2012-05-16T13:07:55.587 に答える
0

お勧めしませんが、XmlTextReader を使用して名前空間なしでドキュメントを読み込むこともできます

// Create XML data element
xmlData = new XmlDocument();

// Read using XmlTextReader to strip namespaces
using (XmlTextReader tr = new XmlTextReader(sourceFile))
{
    tr.Namespaces = false;
    xmlData.Load(tr);
}

データベース構成データを使用してフィールドを検索するときに、名前空間について心配する必要がないようにするために、これをいくつかのドキュメント処理に使用します。

于 2012-05-16T13:12:05.283 に答える