Как я могу заставить XmlDocument работать с XML, у которого нет атрибутов в кавычках? - PullRequest
0 голосов
/ 09 сентября 2011

У меня есть проект asp.net vb, который должен проанализировать какой-то необработанный XML, который выходит из базы данных, XML выглядит так:

<HTML><HEAD><TITLE></TITLE></HEAD><BODY><STRONG><A name=SN>AARTS</A>, <A name=GN>Michelle Marie</A>, </STRONG><A name=HO>B.Sc.</A>, <A name=HO>M.Sc.</A>, <A name=HO>Ph.D.</A>; <A name=OC>scientist, professor</A>; b. <A name=BC>St. Marys</A>, Ont. <A name=BY>1970</A>; <A name=PA>d. Wm. and H. Aarts</A>; <A name=ED>e. Univ. of Western Ont. B.Sc.(Hons.) 1994, M.Sc. 1997</A>; <A name=ED>McGill Univ. Ph.D. 2002</A>; <A name=MA>m. L. MacManus</A>; two children; <A name=PO>CANADA RESEARCH CHAIR IN SIGNAL TRANSDUCTION IN ISCHEMIA</A> and <A name=PO>ASST. PROF., DEPT. OF BIOL. SCI., UNIV. OF TORONTO SCARBOROUGH 2006&ndash;&nbsp;&nbsp;</A>; Postdoctoral Fellow, Toronto Western Hosp. 2000&ndash;06; Expert Cons., Auris Med. SAS, Montpellier, France; mem., Centre for the Neurobiol. of Stress; named INMHA Brainstar of the Year 2003; Bd. of Dirs. &amp; Fundraising Chair, N'Sheemaehn Childcare; mem., Soc. for Neurosci.; Cdn. Physiol. Soc.; Cdn. Assn. for Neurosci.; <A name=WK>co-author: 'Therapeutic Tools in Brain Damage' in <EM>Proteomics and Protein Interactions: Biology, Chemistry, Bioinformatics and Drug Design </EM>2005; 18 pub. journal articles</A>; Office: <A name=OF1_L1>1265 Military Trail</A>, <A name=OF1_CT>Scarborough</A>, <A name=OF1_PR>Ont.</A> <A name=OF1_PC>M1C 1A4</A>. </BODY></HTML>

И код, который я использую, это

        Dim FullBio As New System.Xml.XmlDocument
        Dim NodeList As System.Xml.XmlNodeList
        Dim Node As System.Xml.XmlNode

        FullBio.LoadXml(bio.Item(11))
        NodeList = FullBio.SelectNodes("a")

        For Each Node In NodeList
            Dim name = Node.Attributes.GetNamedItem("name").Value()
            lblEducation.Text = lblEducation.Text + name.ToString() + Node.InnerText + "<br />"
        Next

Таким образом, XML, загруженный в документ XML на

FullBio.LoadXml(bio.Item(11))
это XML, который я предоставил наверху. Я получаю это сообщение об ошибке:
'SN' is an unexpected token. The expected token is '"' or '''. Line 1, position 49.

Я знаю, что ошибка в том, что атрибуты не заключены в кавычки. Есть ли способ заставить XmlDocument понимать атрибуты в любом случае или простой способ использовать выражение reg для добавления кавычек в атрибуты перед загрузкой строки в xmldoc?

Ответы [ 3 ]

2 голосов
/ 09 сентября 2011

То, что у вас есть, является недействительным XML.XmlDocument ожидает, что вводом является допустимый XML .Я бы порекомендовал вам использовать синтаксический анализатор HTML, такой как Html Agility Pack , для анализа HTML (что у вас есть в качестве входных данных).Так, например, если вы хотите перечислить все значения атрибута name для всех якорей, это так просто:

using System;
using HtmlAgilityPack;

class Program
{
    static void Main()
    {
        var document = new HtmlDocument();
        document.Load("test.html");
        foreach (var a in document.DocumentNode.Descendants("a"))
        {
            Console.WriteLine("Name: {0}", a.Attributes["name"].Value);
        }
    }
}
0 голосов
/ 09 сентября 2011

Юо также может попробовать SgmlReader , отлично подходит для такого рода проблем.

using (var strReader = new StringReader(html))
{
    using (SgmlReader sgmlReader = new SgmlReader())
    {
        sgmlReader.DocType = "HTML";
        sgmlReader.WhitespaceHandling = WhitespaceHandling.All;
        sgmlReader.CaseFolding = Sgml.CaseFolding.ToLower;
        sgmlReader.InputStream = strReader;

        // create document
        XmlDocument doc = new XmlDocument();
        doc.PreserveWhitespace = true;
        doc.Load(sgmlReader);
    }
}
0 голосов
/ 09 сентября 2011

Я бы написал логику для вставки кавычек вокруг значений атрибута. Документ будет загружен с ошибками, если XML не отформатирован должным образом.

Для этого вы можете использовать библиотеку Html2Xhtml. Вот ссылка:

http://corsis.sourceforge.net/index.php/Html2Xhtml

И вы сможете использовать библиотеку для помещения содержимого в XDocument, например:

string html = "<html><head><TITLE>title</TITLE></head><body>I♥NY<p>b<br>c:±<img src=2 nonsense=x></a><font size=2>c</font></body></html>";

var xdoc = Html2Xhtml.RunAsFilter(stdin => stdin.Write(html)).ReadToXDocument(keepXhtmlNamespace: true);

Console.WriteLine(xdoc);

Я считаю, что Html2Xhtml поддерживает платформу .NET 2.0 и выше, и если нет, то я уверен, что одна из предыдущих версий будет, но если нет, то вы можете использовать это:

http://www.codeproject.com/KB/XML/HTML2XHTML.aspx

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...