2

I need to obtain html text nodes from, let's say, line 64,line position 45 to line 183,line position 22. I'm pretty new to XPath and I'm not quite sure what are my options. How should I proceed? I had in mind something like this:

var nodes=doc.DocumentNode.SelectNodes("//text()[position() > startPosition and position() < endPosition]");
4

2 に答える 2

2

XPathではこれを行うことはできません。XML内の行番号と文字位置については何も知りません。

このposition()関数は、ノードのリスト内のノードの相対位置を返します。たとえば、リストの最初のノードには1を返し、2番目のノードには2を返します。

行の位置情報を取得するには、XElementまたはXmlReaderを使用してXMLを解析してから、IXmlLineInfoインターフェイスを使用します。

ただし、行/文字の位置を使用してXMLファイルのフラグメントを識別するには問題があることに注意してください。XMLプロセッサは定期的にXMLを再フォーマットし、スペースと終了行を追加/削除するため、同じXMLフラグメントが位置を変更する可能性があります。

于 2013-02-18T19:37:58.970 に答える
2

クラスには 2 つのHtmlNode重要な属性があります (実行する必要があるため)。

  • Line(ノードが始まる行)
  • LinePosition(ノードが終了する行)

次のようなことができます:

var nodes = doc.DocumentNode.Descendants("#text").Where(
    x => (x.Line > 64 || (x.Line == 64 && x.LinePosition >= 45)) &&
         (x.Line < 183 || (x.Line == 183 && x.LinePosition <= 22))
);

もちろん、あなたもできるdoc.DocumentNode.SelectNodes("//text()").Where(...)

あなたが対処しなければならない1つの問題:

ノードがどこで終了するかはわかりません。そのため、上記のソリューションでは、 より大きい行で終了するノード183、または ではある183が より大きい位置で終了するノードが得られる可能性があります22OuterHtmlそのために、ノードのプロパティを使用して、いくつかの文字列操作を行うことができます (長さを取得して終了位置を知る、分割し\nて行数を知るなど)。

于 2013-02-19T01:03:32.427 に答える