Я пишу утилиту для экспорта заметок evernote в Outlook по расписанию. Для Outlook API требуется простой текст, и 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> </div>
<div> </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, отключить экранирование и справиться с любым лишним HTML, который мог туда проникнуть.
Я предполагаю, что есть какая-то комбинация MS API, которая выполнит эту работу, но я этого не знаю.





Насколько я знаю, делать эту конкретную работу нечем, но вы можете попробовать использовать XSLT или пройтись по IXPathNavigable.
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);
}
Я бы использовал регулярное выражение, чтобы вырезать все HTML-теги, этот довольно простой, я уверен, что вы сможете настроить его, если он не будет работать так, как вы хотите.
Regex.Replace("<div>your html in here</div>",@"<(.|\n)*?>",string.Empty);
Вы также можете использовать преобразование xslt для преобразования XML в текстовый документ.
Вы можете использовать Пакет гибкости HTML.
да. С тех пор, как я спросил, я понял, что могу использовать HttpUtility.HtmlDecode для отмены экранирования раздела CDATA, и я, вероятно, просто пройдусь по всем узлам <div> и использую InnerText.