2015-10-12 45 views
0

我想通过每个html节点并获取其属性和innerText。当我扫描任何html时,即使它不存在,我也会得到这个愚蠢的#text节点。C#什么是htmlnode中的#text节点?

这里是我的html

<div class="demographic-info adr editable-item" id="demographics"> 
    <div id="location-container" data-li-template="location"> 
    <div id="location" class="editable-item"> 
     <dl> 
     <dt>Location</dt> 
     <dd> 
      <span class="locality">Bolton, United Kingdom</span> 
     </dd> 
     <dt>Industry</dt> 
     <dd class="industry">Computer Games</dd> 
     </dl> 
    </div> 
    </div> 
</div> 

这里是我的C#

foreach (HtmlNode node in j.ChildNodes) 
    if (node.HasChildNodes) 
     checkNode(node); 

static void checkNode(HtmlNode node) 
{ 
    foreach (HtmlNode n in node.ChildNodes) 
    { 
     if (n.HasChildNodes) 
      checkNode(n); 
     else 
     { 
      HtmlNode nodeValue = hasValueInNode(n); 
      if (nodeValue != null) 
       addCategories(nodeValue); 
     } 
    } 
} 

当我经过调试模式来检查哪个节点编译器是在和我得到这个:

1 = div,2 = #text,3 = div,4 = #text,5 = div,6 = #text,7 = dl ... 等等!

我猜测是检测空白区或返回空间作为节点,但这是浪费循环。有人可以向我解释这个和避免它的方法。谢谢

回答

1

这就是HTML/XML的工作原理。每次在节点内存在一些文本时都有一个文本节点。在这种情况下,它恰好是空格,但它仍然是文本,不能被丢弃。该节点不是“愚蠢的”,它确实存在。

你的代码可以自由地检查文本节点是否为空白,如果你愿意的话可以忽略它,或者你可以制作XML以便没有任何空格。

就像一个想法:你如何知道哪些空白应该是重要的解析器:

<div> 
    <div>Test<span> 
    </span>test</div> 
</div> 

所以,应该解析器只是“有测试,然后还有空跨度元素,然后测试,所以actualy里面的文字是'Testtest'“?或者它会怎么知道该怎么做?

+2

空白在其他一些要素中也很重要,例如, 'pre'或XML格式,无论有'xml:space ='preserve''。 – Joey

+0

@Joey非常好的点 –

+0

好的,谢谢你们 – Photonic