2011-06-25 32 views
1

我從服務器收到類似下面的html。我使用XPath exp @「// text()」重建文本部分,並將「nodeContent」值附加到一個字符串。該代碼是這樣的:使用xpath從html構建文本

for (int i=2; i<[resultXPathQuery count]; i++) { 
    [mytext appendString:[[resultXPathQuery objectAtIndex:i] objectForKey:@"nodeContent"]]; 
    [mytext appendString:@"\n"]; 
} 

我獲得:

Line 1 
line 2 
line 3 
line 4 

我怎麼能建立文字部分也考慮到空節點?
我將獲得:

Line 1 
line 2 

line 3 



line 4 

<html><head><title>A title</title><style type="text/css"> 
ol{margin:0;padding:0}p{margin:0} 
.c0{font-size:12pt;background-color:#ffffff;font-family:Times New Roman} 
.c6{width:432.0pt;background-color:#ffffff;padding:72.0pt 90.0pt 72.0pt 90.0pt} 
.c7{color:#aaaaaa;font-family:Times New Roman} 
.c3{color:#0000ee;text-decoration:underline} 
.c5{color:inherit;text-decoration:inherit} 
.c2{font-size:12pt;font-family:Times New Roman} 
.c4{height:12pt}.c1{direction:ltr} 
body{color:#000000;font-size:12pt;font-family:Times New Roman} 
h1{padding-top:12.0pt;line-height:1.0;text-align:left;color:#000000;font-size:24pt;font- family:Times New Roman;font-weight:bold;padding-bottom:12.0pt} 
h2{padding-top:11.25pt;line-height:1.0;text-align:left;color:#000000;font-size:18pt;font-family:Times New Roman;font-weight:bold;padding-bottom:11.25pt} 
h3{padding-top:12.0pt;line-height:1.0;text-align:left;color:#000000;font-size:14pt;font-family:Times New Roman;font-weight:bold;padding-bottom:12.0pt} 
h4{padding-top:12.75pt;line-height:1.0;text-align:left;color:#000000;font-size:12pt;font-family:Times New Roman;font-weight:bold;padding-bottom:12.75pt} 
h5{padding-top:12.75pt;line-height:1.0;text-align:left;color:#000000;font-size:9pt;font-family:Times New Roman;font-weight:bold;padding-bottom:12.75pt} 
h6{padding-top:18.0pt;line-height:1.0;text-align:left;color:#000000;font-size:8pt;font-family:Times New Roman;font-weight:bold;padding-bottom:18.0pt}</style> 
</head> 
<body class="c6"> 
<p class="c1"><span class="c2">A title</span></p> 
<p class="c1 c4"><span class="c2"></span></p> 
<p class="c4 c1"><span class="c2"></span></p> 
<p class="c1"><span class="c7">Line 1</span></p> 
<p class="c1"><span class="c7">line 2</span></p> 
<p class="c4 c1"><span class="c7"></span></p> 
<p class="c1"><span class="c7">line 3</span></p> 
<p class="c4 c1"><span class="c7"></span></p> 
<p class="c4 c1"><span class="c7"></span></p> 
<p class="c3 c2"><span class="c1"></span></p> 
<p class="c1"><span class="c7">line 4</span></p> 
</body></html> 

編輯

真的,我注意到,HTML可以更 「複雜」,所以它沒有足夠的選擇所有span元素或p元素。而且,更多的span元素可以出現在同一個p元素中,所以在這種情況下,我不必在我的字符串中創建一個新行。

這是一個比較複雜的返回的HTML的主體:

<body class="c13"> 
<p class="c5"><span>gfgfgfd</span></p> 
<p class="c1"><span></span></p> 
<p class="c5 c10"><span>ghhgfhgfh hghg hgkfhjgk ghjgkh ghjgjhg gjhjg gjhj gjhgjhgjhg gfhjkgjg jghjgfhjgf fghfj jghfj fghjggf jhgjgjgkjg</span></p> 
<p class="c1 c10"><span></span></p> 
<p class="c4"><span>gfgfgfd</span></p> 
<p class="c4"><span>f</span></p> 
<p class="c4"> 
    <span>gfdgfdg</span> 
    <span class="c7">hg</span></p> 
<p class="c4"><span class="c7">ghgfhgfh</span></p> 
<p class="c4"><span class="c7">gfhgfhgf</span></p> 
<p class="c5"> 
    <span class="c7">hgfh </span> 
    <span class="c0">gfdgfg</span></p> 
<p class="c5"><span class="c0">fgfdgfdgfd</span></p> 
<p class="c5"><span class="c0">gdfgdfgfd</span></p> 
<p class="c5"><span class="c0">gfgf</span></p> 
<p class="c1"><span class="c0"></span></p> 
<p class="c5"><span class="c0 c8"><a class="c12" href="http://www.google.com">www.google.com</a></span></p> 
<p class="c1"><span class="c0"></span></p> 
<p class="c5"><span class="c0">fgfdgfdg</span></p> 
<p class="c5"> 
    <span class="c0">fgffgfdgfg</span> 
    <span class="c0 c11">gfgfdgfd fgd fd</span> 
    <span class="c0">fdgfdg</span></p> 
<p class="c5"><span class="c0">fgfdgfdgf</span></p> 
<p class="c5"><span class="c0">gfd</span></p> 
<p class="c5"><span class="c0">gfgf</span></p> 
<p class="c1"><span class="c0"></span></p> 
<p class="c5"><span class="c0 c8"><a class="c12" href="mailto:….">...</a></span></p> 
<p class="c1"><span class="c0"></span></p> 
<ol class="c9" start="1"> 
<li class="c3"><span class="c0">gfgfd</span></li> 
<li class="c3"><span class="c0">gfdgfd</span></li> 
<li class="c3"><span class="c0">gfdgfd</span></li> 
<li class="c3"><span class="c0">gdfgfd</span></li> 
</ol> 
<p class="c1"><span class="c0"></span></p> 
<p class="c5"><span class="c0">hgfhgf</span></p> 
<p class="c5"><span class="c0">gfhgfh</span></p> 
<p class="c5"><span class="c0">hgfhgf</span></p> 
<p class="c1"><span class="c0"></span></p> 
<ol class="c2" start="1"> 
<li class="c3"><span class="c0">gfhg</span></li> 
<li class="c3"><span class="c0">hgfh</span></li> 
<li class="c3"><span class="c0">hgf</span></li> 
</ol> 
<p class="c1"><span class="c0"></span></p> 
<h1 class="c5 c15"><a name="h.kafwflosthlg"></a><span class="c7 c14">hgfhgfh</span></h1> 
<p class="c1"><span class="c6"></span></p> 
<p class="c1"><span class="c6"></span></p> 
<p class="c1"><span class="c6"></span></p> 
</body> 

我需要,其選擇P,H1,H2,...,H6,li元素XPath表達式,並考慮內側文本部分以這種方式可以正確檢測到新行和空行。

回答

0

對於上面的示例,您可以使用//span,它將返回所有<span>元素,而不管其內容如何。它看起來像你正在做一些其他的過濾也是因爲//text()也應該返回您的CSS塊和<title><span>

+0

是的,在for語句中,var i從2開始,所以我省略了內聯css和標題。我有一些其他的嘗試來檢查服務器(GDocs)是否總是使用這種形式。在這種情況下,我怎樣才能使用// span和// text()?此外,你是否知道如何在沒有其他元素的情況下使用跨度元素,例如取所有不包含img元素的跨度元素? – Sefran

+0

@Objnewbie - '@「nodeContent」'應該返回節點的文本值(在本例中爲'span的文本值)。如果沒有文本值,您將不得不嘗試是否爲空字符串或零。要獲得只有沒有img元素的跨度,請使用'// span [not(img)]'之類的東西。 – cordsen

+0

謝謝。我注意到,返回的html可能比上面的(第一個)更「複雜」,正如您在第二個示例中看到的那樣。 – Sefran

0

我寧願使用正則表達式爲這一個:身體標記之間

  1. 抓住所有的內容(你也可以做到這一點的XPath)
  2. 通過</p>\n
  3. 地帶標籤
  4. 更換 </p>
相關問題