Ошибка в документе XML (155, 23). Без ошибок и всегда на странице 13

У меня возникли проблемы с разбором некоторых 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!

Спасибо за помощь!!!


person Ørjan    schedule 01.10.2014    source источник
comment
Проведите простой тест: выгрузите каждую страницу на жесткий диск, прежде чем пытаться ее десериализовать. Вы можете сделать это следующим образом: stackoverflow.com/questions/3988832/ и после этого попробуйте десериализовать файлы с жесткого диска.   -  person Erti-Chris Eelmaa    schedule 01.10.2014
comment
Привет и спасибо за ответ! Я все еще получаю ту же ошибку, хотя я выгружаю каждую страницу на жесткий диск, прежде чем пытаться ее десериализовать.   -  person Ørjan    schedule 01.10.2014
comment
Прикрепите конкретный XML, с которым у вас возникли проблемы, и добавьте структуру search_results.   -  person Erti-Chris Eelmaa    schedule 01.10.2014
comment
Теперь я добавил файлы, которые вы просили. Кстати, я также пытался добавить следующий XSD-файл в настройки XMLReader: clinicaltrials.gov/ct2/html/images/info/public.xsd, но все та же ошибка...   -  person Ørjan    schedule 01.10.2014


Ответы (1)


частный byte orderField;

Тип Диапазон Размер Тип .NET Framework байт от 0 до 255 8-разрядное целое число без знака System.Byte

Как только он доберется до этой записи, он, вероятно, должен рухнуть.

<clinical_study>
    <order>256</order>
    <score>1.00</score>
    <nct_id>NCT00006461</nct_id>
    <url>http://ClinicalTrials.gov/show/NCT00006461</url>
    <title>
        Combination Chemotherapy Followed by Second-Look Surgery and ...
    </title>
    <status open="N">Completed</status>
    <condition_summary>
        Untreated Childhood Medulloblastoma; Untreated Childhood..
    </condition_summary>
    <last_changed>August 7, 2013</last_changed>
</clinical_study>

Как видите, byte не может поддерживать порядок со значением 256. Обычно такие проблемы обнаруживаются тем, что вы ВСЕГДА проверяете все на соответствие схемам перед десериализацией.

Ps вашей данной схеме, кажется, 3 года. У него нет таких свойств, как «condition_summary» и т. д. Возможно, вам лучше создать свои собственные с нуля или из существующего XML.

person Erti-Chris Eelmaa    schedule 01.10.2014
comment
Спасибо! Я отмечаю это как решенное, так как теперь все это имеет смысл! Я не могу проголосовать из-за слишком низкой репутации, но сделаю это позже! Спасибо еще раз! - person Ørjan; 01.10.2014