Вы можете создать подкласс XmlTextReader
и переопределить ReadElementString
, чтобы пропустить или изменить нарушающий элемент во время его чтения. Все еще ощущается как хак, но, по крайней мере, избегает предварительной обработки с помощью регулярных выражений.
Вот простая реализация, которая выполняет свою работу:
class BrokenFeedXmlReader : XmlTextReader
{
// Additional XmlTextReader constructors can be added in
// similar fashion as needed
public BrokenFeedXmlReader(TextReader input)
: base(input)
{
}
public override string ReadElementString()
{
if ("copyright" == Name)
{
base.Skip();
return String.Empty;
}
return base.ReadElementString();
}
}
Ваш пример кода будет выглядеть примерно так:
using (XmlReader xmlr = new BrokenFeedXmlReader(new StringReader(allXml)))
{
var items = from item in SyndicationFeed.Load(xmlr).Items
select item;
}