0

我正在编写一个实用程序来按计划将印象笔记笔记导出到 Outlook 中。Outlook API 需要纯文本,Evernote 输出纯文本笔记的 XHTML 文档版本。我需要的是去掉所有标签,并取消嵌入在 Evernote 导出文件中的源 XHTML 文档。

基本上我需要转;

<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>

进入

    测试同步注 1
    这个我有一些文字


    和第二行

我可以轻松地解析出 CDATA 部分并仅获取 4 行文本,但我需要一种可靠的方法来剥离 div、取消转义并处理可能潜入其中的任何额外 HTML。

我假设有一些 MS API 组合可以完成这项工作,但我不知道。

4

5 回答 5

1

我会使用正则表达式来去除所有的 HTML 标签,这个非常基本,我相信如果它不能完全按照你的意愿工作,你是否可以调整它。

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

于 2008-10-28T07:15:59.913 回答
1

您还可以使用 xslt 转换将 xml 转换为文本文档。

于 2008-10-28T07:42:24.540 回答
1

您可以使用HTML 敏捷包

于 2008-10-28T15:36:29.950 回答
0

据我所知,没有什么可以做这项特定的工作,但您可能想看看使用 XSLT 或浏览 IXPathNavigable。

于 2008-10-28T05:55:02.307 回答
0
        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);
        }
于 2008-10-28T06:18:56.720 回答