Загрузка не очень правильно сформированного XML в XDocument (несколько DTD) - PullRequest
0 голосов
/ 21 апреля 2010

У меня проблема с обработкой данных, которые представляют собой почти правильно сформированный документ XHTML, за исключением того, что в начале он содержит несколько объявлений DTD:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">

<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    ...
  </head>
  <body>
    ...
  </body>
</html>

Мне нужно загрузить эти данные в объект XDocument, используя только first DTD и , игнорируя остальные объявления. Невозможно полностью игнорировать обработку DTD, поскольку документ может содержать необычные символы, такие как &acirc; или &euro; и т. Д.

Текст получен из внешнего источника, и я понятия не имею, почему он так поступает.

Очевидно, что моя наивная попытка загрузить этот документ не удалась с System.Xml.XmlException : Cannot have multiple DTDs:

        var xmlReaderSettings = new XmlReaderSettings
                                    {
                                        DtdProcessing = DtdProcessing.Parse,
                                        XmlResolver = new XmlPreloadedResolver(),
                                        ConformanceLevel = ConformanceLevel.Document,
                                    };
        using (var xmlReader = XmlReader.Create(stream, xmlReaderSettings))
        {
            return XDocument.Load(xmlReader);
        }

Каков наилучший способ обработки данных такого типа?

P.S .: Я забыл упомянуть, что данные поступают с Stream, который может или не может манипулировать строками немного сложнее

1 Ответ

1 голос
/ 21 апреля 2010

Я не уверен, есть ли параметр XmlReader, который будет игнорировать эту проблему, но вы всегда можете использовать стандартные манипуляции со строками для удаления лишних типов документов.

...