htmlagilitypack 텍스트 노드의 부모는 옵션 대신 선택됩니까?

html-agility-pack

문제

htmlagility를 사용하여 select로 구성된 DOM 구조에서 텍스트 노드를 찾고 있습니다.

<select>
  <option>
    one
  </option>
  <option>
    two
  </option>
</select>

부모 노드는

<select>
  <option>
    one
  </option>
  <option>
    two
  </option>
</select>

대신에

<select>
  <option>
    one
  </option>
  <option>
    two
  </option>
</select>

왜?

<select>
  <option>
    one
  </option>
  <option>
    two
  </option>
</select>

수락 된 답변

기본적으로 HtmlAgilityPack은 <option> 태그를 닫을 수 있기 때문입니다. HAP은 HTML을 다음과 같이 봅니다.

Console.WriteLine(doc.DocumentNode.OuterHtml);
//result :
//<select><option>one<option>two</select>

위의 링크 된 질문에서 언급했듯이 HtmlDocument 를 시작하기 전에 다음 행을 호출하여 해당 동작을 변경할 수 있습니다.

Console.WriteLine(doc.DocumentNode.OuterHtml);
//result :
//<select><option>one<option>two</select>

인기 답변

   [TestMethod]
    public void TestTraverseTextNodesInSelect()
    {
      HtmlNode.ElementsFlags.Remove("option");
      var html = "<select><option>one</option><option>two</option></select>";

      var doc = new HtmlDocument();
      doc.Load(new StringReader(html));

      var elements = doc.DocumentNode.Descendants().Where(n=>n.Name == "#text");

      Assert.AreEqual(2, elements.Count());
      Assert.AreEqual("select", elements.ElementAt(0).ParentNode.Name);
      Assert.AreEqual("select", elements.ElementAt(1).ParentNode.Name);
    }

당신은 이것을 시도 할 수 있습니다.

도서관에는 이런 식으로되어 있습니다. 그것을 제거해야합니다. 기본적으로 AgilityPack은 옵션 태그를 비어있는 것으로 처리하도록 설정됩니다.

   [TestMethod]
    public void TestTraverseTextNodesInSelect()
    {
      HtmlNode.ElementsFlags.Remove("option");
      var html = "<select><option>one</option><option>two</option></select>";

      var doc = new HtmlDocument();
      doc.Load(new StringReader(html));

      var elements = doc.DocumentNode.Descendants().Where(n=>n.Name == "#text");

      Assert.AreEqual(2, elements.Count());
      Assert.AreEqual("select", elements.ElementAt(0).ParentNode.Name);
      Assert.AreEqual("select", elements.ElementAt(1).ParentNode.Name);
    }



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.