2011-06-25 2 views
1

Я получаю html, как показано ниже с сервера. Я перестраиваю текстовую часть, используя XPath exp @ "// text()" и добавляя значение "nodeContent" к строке. Код что-то вроде этого:Создайте текст из html с помощью xpath

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> 

EDIT

Действительно, я заметил, что HTML может быть более "сложным", так что это не достаточно выбрать все элементы пролетных или p элементов. Более того, более элементы диапазона могут отображаться в одном и том же элементе 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> 

мне понадобится выражение XPath, который выбирает р, h1, h2, ..., h6, Li элементов, и считает, что внутренняя текстовую часть таким образом, чтобы новая строка и пустые строки были правильно обнаружены.

ответ

0

Для примера выше вы можете использовать //span, который будет возвращать все элементы <span> независимо от их содержимого. Похоже, что вы делаете другую фильтрацию, потому что // text() также должен вернуть ваш блок CSS и A Title из <title> и сначала <span>.

+0

Да, в инструкции for var i начинается с 2, поэтому я не указываю встроенный css и заголовок. Я должен попробовать некоторые другие попытки проверить, всегда ли сервер (GDocs) использует такую ​​форму. В случае, как я могу использовать // span вместе с // text()? Кроме того, знаете ли вы, как принимать элементы span без других элементов в нем, например, взять все элементы span, которые не содержат элемент img? – Sefran

+0

@Objnewbie - '@" nodeContent "' должен возвращать текстовое значение узла (в данном случае 'текстовое значение' span'). Вам нужно будет поэкспериментировать, чтобы увидеть, является ли это пустой строкой или нулем, когда текстовое значение отсутствует. Чтобы получить только диапазон, в котором нет элементов img, используйте что-то вроде '// span [not (img)]'. – cordsen

+0

Спасибо. Я заметил, что возвращаемый html может быть более «сложным», чем предыдущий (первый), как вы можете видеть во втором примере. – Sefran

0

Я предпочел бы использовать регулярное выражение для этого один:

  1. захватить все содержимое между тегами (вы также можете сделать это с помощью XPath)
  2. Заменить </p> на </p>\n
  3. Газа теги
Смежные вопросы