Вырезать WordML из строки - PullRequest
2 голосов
/ 28 октября 2008

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

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

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

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

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

Спасибо.

Ответы [ 3 ]

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

Я еще не работал с 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>

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

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

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

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

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

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

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.

...