C # код для преобразования документа XHTML в простой текст - PullRequest
0 голосов
/ 28 октября 2008

Я пишу утилиту для экспорта заметок evernote в Outlook по расписанию. API Outlook требуется простой текст, а Evernote выводит версию документа в формате XHTML для заметки в виде простого текста. Мне нужно удалить все теги и удалить исходный документ XHTML, встроенный в файл экспорта Evernote.

В основном мне нужно повернуть;

<note>
  <title>Test Sync Note 1</title> 
  <content>
  <![CDATA[ <?xml version="1.0" encoding="UTF-8"?>
   <!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml.dtd">

<en-note bgcolor="#FFFFFF">
<div>Test Sync Note 1</div>
<div>This i has some text in it</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>and a second line</div>
</en-note>

  ]]> 
  </content>
  <created>20081028T045727Z</created> 
  <updated>20081028T051346Z</updated> 
  <tag>Test</tag> 
</note>

В


    Test Sync Note 1
    This i has some text in it


    and a second line

Я могу легко разобрать секцию CDATA и получить только 4 строки текста, но мне нужен надежный способ убрать div, unescape и разобраться с любым дополнительным HTML, который мог бы там пробраться.

Я предполагаю, что есть некоторая комбинация MS API, которая сделает эту работу, но я этого не знаю.

Ответы [ 5 ]

1 голос
/ 28 октября 2008

Вы можете использовать HTML Agility Pack .

1 голос
/ 28 октября 2008

Вы также можете использовать преобразование xslt для преобразования xml в текстовый документ.

1 голос
/ 28 октября 2008

Я бы использовал регулярное выражение, чтобы убрать все теги HTML, этот довольно простой, я уверен, что вы сможете настроить его, если он не работает так, как вам нужно.

Regex.Replace("<div>your html in here</div>",@"<(.|\n)*?>",string.Empty);

0 голосов
/ 28 октября 2008
        string xml = @"<note>
          <title>Test Sync Note 1</title> 
          <content>
          <![CDATA[ <?xml version=""1.0"" encoding=""UTF-8""?>
           <!DOCTYPE en-note SYSTEM ""http://xml.evernote.com/pub/enml.dtd"">

        <en-note bgcolor=""#FFFFFF"">
        <div>Test Sync Note 1</div>
        <div>This i has some text in it</div>
        <div> </div>
        <div> </div>
        <div>and a second line</div>
        </en-note>

          ]]> 
          </content>
          <created>20081028T045727Z</created> 
          <updated>20081028T051346Z</updated> 
          <tag>Test</tag> 
        </note>
        ";
        XPathDocument doc = new XPathDocument(new StringReader(xml));
        XPathNavigator nav = doc.CreateNavigator();

        // Compile a standard XPath expression

        XPathExpression expr;
        expr = nav.Compile("/note/content");
        XPathNodeIterator iterator = nav.Select(expr);

        // Iterate on the node set

        try
        {
            while (iterator.MoveNext())
            {
                //Get the XML in the CDATA
                XPathNavigator nav2 = iterator.Current.Clone();
                XPathDocument doc2 = new XPathDocument(new StringReader(nav2.Value.Trim()));

                //Parse the XML in the CDATA
                XPathNavigator nav3 = doc2.CreateNavigator();
                expr = nav3.Compile("/en-note");
                XPathNodeIterator iterator2 = nav3.Select(expr);
                iterator2.MoveNext();
                XPathNavigator nav4 = iterator2.Current.Clone();

                //Output the value directly, does not preserve the formatting
                Console.WriteLine("Direct Try:");
                Console.WriteLine(nav4.Value);

                //This works, but is ugly
                Console.WriteLine("Ugly Try:");
                Console.WriteLine(nav4.InnerXml.Replace("<div>","").Replace("</div>",Environment.NewLine));
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
0 голосов
/ 28 октября 2008

Насколько я знаю, ничего особенного для выполнения этой работы не существует, но вы, возможно, захотите взглянуть на использование XSLT или обход IXPathNavigable.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...