Удалить WordML из строки

Мне поручили создать доступную RSS-ленту для списков вакансий моей компании. У меня уже есть RSS-канал от нашего партнера по подбору персонала; поэтому я преобразовываю их RSS XML в наш собственный прокси-канал RSS, чтобы добавить дополнительные данные, а также ограничить количество элементов в канале, чтобы мы перечисляли последние вакансии.

RSS проверяет через feedvalidator.org (с предупреждениями); но проблема вот в чем. К сожалению, сколько бы раз я ни говорил им этого не делать; Отдел кадров моей компании напрямую копирует и вставляет свои документы Word в CMS наших партнеров по подбору персонала при вставке новых списков вакансий, оставляя WordML в моей ленте. Я считаю, что этот WordML вызывает проблемы с функцией Feedburner BrowserFriendly; которые мы хотим показать, чтобы людям было легче подписаться. Поэтому мне нужно удалить разметку WordML в ленте.

У кого-нибудь есть опыт делать это? Может ли кто-нибудь указать мне хорошее решение этой проблемы?

Предпочтительно; Я хотел бы, чтобы мне указали на решение в .Net (VB или C# в порядке) и/или XSL.

Любые советы по этому поводу очень ценятся.

Спасибо.


person Frank Rosario    schedule 27.10.2008    source источник


Ответы (3)


Я еще не работал с WordML, но если предположить, что его элементы находятся в пространстве имен, отличном от пространства имен RSS, это должно быть довольно просто сделать с помощью XSLT.

Начните с базового преобразования удостоверений (таблицы стилей, которая добавляет все узлы из входного документа «как есть» в выходное дерево). Вам понадобятся эти два шаблона:

  <!-- Copy all elements, and recur on their child nodes. -->
  <xsl:template match="*">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>

  <!-- Copy all non-element nodes. -->
  <xsl:template match="@*|text()|comment()|processing-instruction()">
    <xsl:copy/>
  </xsl:template>

Преобразование, использующее таблицу стилей, содержащую только два вышеуказанных шаблона, будет точно воспроизводить входной документ на выходе по модулю тех вещей, которые разрешено изменять XML-процессорам, совместимым со стандартами, таких как замена объекта.

Теперь добавьте шаблон, соответствующий любому элементу в пространстве имен WordML. Давайте дадим ему префикс пространства имен «wml» для целей этого примера:

  <!-- Do not copy WordML elements or their attributes to the 
       output tree; just recur on child nodes. -->
  <xsl:template match="wml:*">
    <xsl:apply-templates/>
  </xsl:template>

Начало и конец таблицы стилей оставлены кодировщику в качестве упражнения.

person ChuckB    schedule 28.10.2008

Джефф Эттвуд некоторое время назад писал в своем блоге о том, как это сделать. Его сообщение содержит некоторый код С#, который очистит WordML.

http://www.codinghorror.com/blog/archives/000485.html

person d4nt    schedule 28.10.2008
comment
Статья Джеффа посвящена очистке нежелательного HTML-кода, создаваемого Word, а не удалению элементов XML из файла WordML. - person Chris Zwiryk; 05.11.2009
comment
Спрашивающий говорил, что содержимое, которое копируется и вставляется из Word, содержит множество нежелательных тегов html. Код Джеффа удалит их. - person d4nt; 09.11.2009

Я бы сделал что-то вроде этого:

char[] charToRemove = { (char)8217, (char)8216, (char)8220, (char)8221, (char)8211 };
char[] charToAdd = { (char)39, (char)39, (char)34, (char)34, '-' };
string cleanedStr = "Your WordML filled Feed Text.";

for (int i = 0; i < charToRemove.Length; i++)
{
    cleanedStr = cleanedStr.Replace(charToRemove.GetValue(i).ToString(), charToAdd.GetValue(i).ToString());
}

Это будет искать символы в ссылке (которые являются специальными символами Word, которые все портят и заменяют их эквивалентами ASCII.

person Community    schedule 27.10.2008