2015-11-05 3 views
0

На сервере я возвращаю фрагмент HTML в виде строки через AJAX от клиента JS. Содержимое представляет собой вложенный DIV с элементами ul, li. HTML DIv snippetПолучить вложенные узлы в строке с помощью Xpath или HtmlAgilityPack

<div> //please see link above 
     <ul class="tree" id="ulID" name="input"> 
      <li><span class="vertical..."></span> 
       <div></span>1</div> 
       <ul>.. 
</div> 

Я использую C# HtmlAgilityPack, но я не в состоянии получить вложенные содержимое для извлечения данных, а также добавить данные обратно.

Ниже приведен код.

HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument(); 

// nested 
htmlDoc.OptionFixNestedTags=true; 

bool failed = false; 

// Use: htmlDoc.LoadHtml(htmlString); 

// ParseErrors is an ArrayList 
if (htmlDoc.ParseErrors != null && htmlDoc.ParseErrors.Count() > 0) 
{ 
    // Handle any parse errors as required 
    // check if string was JSON formatted 
    if (htmlDoc.LoadHtml(JSONdeserialize(htmlString)).ParseErrors.Count() > 0) failed = true; 
} 
else 
{ 

    if (htmlDoc.DocumentNode != null) 
    { 
     HtmlAgilityPack.HtmlNode bodyNode = htmlDoc.DocumentNode.SelectSingleNode("//ulID"); 

     if (bodyNode != null) 
     { 
      // **how can I get the contents of the node here??**** 
      // what is the xpath to get all the structured contents so I can walk the tree 
      // If option walk tree 
      // How can I build foreach(HTMLnode node in nodes) nested array 
     } 
    } 
} 
  1. Что такое Xpath, чтобы выбрать все содержимое в DOM строки, когда у меня нет тела, но просто Div enclosed string.
  2. Как извлечь все узлы и их содержимое на их вложенных уровнях
  3. Любые рекомендации по сохранению этой структуры? так что я могу легко восстановить его?

ответ

1

Я не уверен, что у вас теперь есть Xpath. Я также не уверен, когда заканчивается первый тег ul. Если он заканчивается непосредственно перед закрытием div. Тогда вы можете просто использовать этот xpath.

"//ul[@id='ulID']" 

Затем вы получаете первый ul htmlnode. Затем вы можете проходить через своих детей. Я настоятельно рекомендую вам взглянуть на некоторые xpath examples.

+0

Это дает мне все элементы UL, как я могу это сделать для a) всех элементов, b) только элементы 'li', или только объекты' div', указанные ниже списка, я сделал это »// ul [@id = 'ulID'] // li ", но не работает для элементов li – everest

+1

После этого xpath:" // ul [@ id = 'ulID'] "У вас есть один HtmlNode. Вы можете позвонить. bodyNode.ChildNodes - получить HtmlNodeCollection всех дочерних узлов. В цикле foreach вы можете отсортировать их с выражением if как таковым, если (htmlNode.OriginalName == "li"). –

+0

Это даст мне словарь, например список, или как я могу сохранить иерархическое вложение? – everest

Смежные вопросы