У меня возникли проблемы с разбором некоторых XML-данных на С#.
Обзор метода:
Метод берет ключевое слово, а затем выполняет поиск по этому ключевому слову на сайте www.clinicaltrials.com, используя URI веб-сайта. Например:
http://www.clinicaltrials.gov/ct2/results?term=ALL&Search=Search&displayxml=true.
Этот URI будет отображать все клинические исследования, хранящиеся в Clinical Trials, в виде XML. Из-за большого количества клинических данных у них только 20 исследований на каждой странице. Таким образом, чтобы перейти на следующую страницу, вам нужно добавить &pg=2, чтобы перейти на вторую страницу. Мои коды анализируют все страницы и преобразуют каждую страницу в объекты С#.
Проблема:
Проблема в том, что когда он доходит до страницы 13, он вылетает со следующей ошибкой:
InvalidOperationException не было обработано: ошибка в XML-документе (155, 23)
Когда я копирую XML для страницы 13, 12 или любой другой страницы, близкой к странице 13, в средство проверки XML, он говорит, что все в порядке. И когда я сам ищу xml, я не могу найти никаких ошибок. Я думал может память переполнена, но после 240 объектов? Если я ищу ключевое слово, которое извлекает менее 13 страниц результатов, оно работает.
Код, который я написал для извлечения и анализа XML, вы можете прочитать здесь:
public List<search_resultsClinical_study> SearchStudyByKeyword(string keyword)
{
int currentPage = 1;
double numberOfStudiesOnAPage = 20;
double totalPages = 1; //if not it will crash anyways
List<search_results> searchResult = new List<search_results>();
try
{
while (totalPages >= currentPage)
{
//crashes if search is larger then 13 pages... have to figure out why....
string newUri = URI + "ct2/results?term=" + keyword + "&Search=Search&displayxml=true&pg=" + currentPage ;
System.Xml.Serialization.XmlSerializer reader = new System.Xml.Serialization.XmlSerializer(typeof(search_results));
XmlReader xmlReader = XmlReader.Create(newUri);
search_results studies = new search_results();
studies = (search_results)reader.Deserialize(xmlReader);
searchResult.Add(studies);
totalPages = Math.Ceiling((double)studies.count / numberOfStudiesOnAPage);
currentPage += 1;
}
//return searchResult;
//Append all studies to one list, easier to handle for user
List<search_resultsClinical_study> result = new List<search_resultsClinical_study>();
foreach (search_results sr in searchResult)
{
foreach (search_resultsClinical_study cs in sr.clinical_study)
{
result.Add(cs);
}
}
return result;
}
catch (WebException)
{
Debug.Write("404 - Might be a invalid search term ");
return null;
}
}
Ошибка появляется в следующей строке:
studies = (search_results)reader.Deserialize(xmlReader);
класс search_result:
/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class search_results
{
private string queryField;
private search_resultsClinical_study[] clinical_studyField;
private uint countField;
/// <remarks/>
public string query
{
get
{
return this.queryField;
}
set
{
this.queryField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("clinical_study")]
public search_resultsClinical_study[] clinical_study
{
get
{
return this.clinical_studyField;
}
set
{
this.clinical_studyField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public uint count
{
get
{
return this.countField;
}
set
{
this.countField = value;
}
}
}
/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class search_resultsClinical_study
{
private byte orderField;
private decimal scoreField;
private string nct_idField;
private string urlField;
private string titleField;
private search_resultsClinical_studyStatus statusField;
private string condition_summaryField;
private string last_changedField;
/// <remarks/>
public byte order
{
get
{
return this.orderField;
}
set
{
this.orderField = value;
}
}
/// <remarks/>
public decimal score
{
get
{
return this.scoreField;
}
set
{
this.scoreField = value;
}
}
/// <remarks/>
public string nct_id
{
get
{
return this.nct_idField;
}
set
{
this.nct_idField = value;
}
}
/// <remarks/>
public string url
{
get
{
return this.urlField;
}
set
{
this.urlField = value;
}
}
/// <remarks/>
public string title
{
get
{
return this.titleField;
}
set
{
this.titleField = value;
}
}
/// <remarks/>
public search_resultsClinical_studyStatus status
{
get
{
return this.statusField;
}
set
{
this.statusField = value;
}
}
/// <remarks/>
public string condition_summary
{
get
{
return this.condition_summaryField;
}
set
{
this.condition_summaryField = value;
}
}
/// <remarks/>
public string last_changed
{
get
{
return this.last_changedField;
}
set
{
this.last_changedField = value;
}
}
}
/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class search_resultsClinical_studyStatus
{
private string openField;
private string valueField;
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public string open
{
get
{
return this.openField;
}
set
{
this.openField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlTextAttribute()]
public string Value
{
get
{
return this.valueField;
}
set
{
this.valueField = value;
}
}
}
Неверный XML:
http://www.clinicaltrials.gov/ct2/results?term=ALL&Search=Search&displayxml=true&pg=13
Кто-нибудь понял, почему появляется эта ошибка? Я также добавил XmlSchema и вместо этого попытался сгенерировать класс C# на основе XmlSchema!
Спасибо за помощь!!!