XPath - selecciona el texto de los nodos secundarios seleccionados

html-agility-pack xpath

Pregunta

Dado que tengo un siguiente xml:

<div id="Main">
    <div class="quote">
        This is a quote and I don't want this text
    </div> 
    <p>
        This is content.
    </p>
    <p>  
        This is also content and I want both of them
    </p>
</div>

¿Hay "un XPath" para ayudarme a seleccionar el texto interno de div # Main como un solo nodo , pero debe excluir los textos de cualquier div.quote .

Solo quiero el texto: "Esto es contenido. Esto también es contenido y los quiero a ambos"

Gracias por adelantado

Aquí está el código para probar el XPath, estoy usando .NET con HtmlAgilityPack pero creo que xPath debería funcionar con cualquier idioma.

[Test]
public void TestSelectNode()
{
    // Arrange 
    var html = "<div id=\"Main\"><div class=\"quote\">This is a quote and I don't want this text</div><p>This is content.</p><p>This is also content and I want both of them</p></div>";
    var xPath = "//div/*[not(self::div and @class=\"quote\")]/text()";

    var doc = new HtmlDocument();
    doc.LoadHtml(html);

    // Action
    var node = doc.DocumentNode.SelectSingleNode(xPath);

    // Assert
    Assert.AreEqual("This is content.This is also content and I want both of them", node.InnerText);
}

Obviamente, la prueba falló porque la xPath todavía no es correcta.

Test 'XPathExperiments/TestSelectNode' failed:
    Expected values to be equal.

    Expected Value : "This is content.This is also content and I want both of them"
    Actual Value   : "This is content."

Respuesta aceptada

No creo que exista una XPath que le dé esto como un solo nodo, porque los valores que está tratando de obtener no son un solo nodo. ¿Hay alguna razón por la que no puedas hacer esto?

StringBuilder sb = new StringBuilder();
// Action
var nodes = doc.DocumentNode.SelectNodes(xPath);
foreach(var node in nodes)
{
   sb.Append(node.InnerText);
}

// Assert
Assert.AreEqual("This is content.This is also content and I want both of them", 
                sb.ToString());

Respuesta popular

Desea que el texto de cualquier hijo del div que no sea div con cita de clase:

div/*[not(self::div and @class="quote")]/text()


Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow