Pregunta

Estoy tratando de obtener el texto plano de un documento de Word. En concreto, el XPath me está dando problemas. ¿Cómo se seleccionan las etiquetas? Aquí está el código que tengo.

public static string TextDump(Package package)
{
    StringBuilder builder = new StringBuilder();

    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.Load(package.GetPart(new Uri("/word/document.xml", UriKind.Relative)).GetStream());

    foreach (XmlNode node in xmlDoc.SelectNodes("/descendant::w:t"))
    {
        builder.AppendLine(node.InnerText);
    }
    return builder.ToString();
}
¿Fue útil?

Solución

Su problema es que los espacios de nombres XML. SelectNodes no sabe cómo traducir <w:t/> al espacio de nombres completo. Por lo tanto, es necesario utilizar la sobrecarga, que toma un XmlNamespaceManager como segundo argumento. He modificado su código un poco, y parece que funciona:

    public static string TextDump(Package package)
    {
        StringBuilder builder = new StringBuilder();

        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(package.GetPart(new Uri("/word/document.xml", UriKind.Relative)).GetStream());
        XmlNamespaceManager mgr = new XmlNamespaceManager(xmlDoc.NameTable);
        mgr.AddNamespace("w", "http://schemas.openxmlformats.org/wordprocessingml/2006/main");

        foreach (XmlNode node in xmlDoc.SelectNodes("/descendant::w:t", mgr))
        {
            builder.AppendLine(node.InnerText);
        }
        return builder.ToString();
    }

Otros consejos

Tome un vistazo a la formato abierto XML SDK 2.0 . Hay algunos ejemplos de cómo procesar documentos, como esto .

A pesar de que no lo he utilizado, no es este Open Office XML C # Biblioteca que pueda echar un vistazo a también.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top