MSXMLはXMLパーサーです.XMLを入力としてDOMを作りXPathを使えます.でもHTMLは入力にはなりえません.それを解決する手段が他の方も言及されているXHTMLとすることです.
もうご覧になっていらっしゃると思いますが、サンプルは以下です.
Using MSXML with HTML
https://msdn.microsoft.com/en-us/library/ms759123%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396
引用テキストvalidateOnParse = False とすると良さ気なのでやってみても
これは単に入力XMLをスキーマやDTDで検証しないだけで、入力がwell-formedなXMLである条件には変わりはありません.
調査する際は、ブラウザのコンソールで$x('//tr')とかやるとさっくり取ってくれます。
世の中のブラウザはHTML DOM+XPathをサポートしているので、ブラウザコンソールではできちゃいますね~.
という訳でMSXMLは入力がXHTMLでない限りあきらめられた方が良いと思います.
以上 少しでもお役にたてば.
[追記]
コメントに書きましたプログラムです.
vb
1 Imports System . Xml
2 Imports System . Xml . XPath
3 Imports System . Text . Encoding
4 Imports Sgml
5 Module HtmlXPathModule
6 Sub Main ( )
7 Dim xw As XmlWriter = CreateXmlWriter ( "maxTemp.xml" )
8 xw . WriteStartElement ( "tempDataRoot" , "" )
9 Dim sgml As SgmlReader = New SgmlReader ( )
10 sgml . DocType = "HTML"
11 sgml . Href = "http://www.data.jma.go.jp/obd/stats/data/mdrr/synopday/data1s.html"
12 sgml . IgnoreDtd = True
13 Dim htmlDoc As XDocument = XDocument . Load ( sgml )
14 Dim nsTable As NameTable = New NameTable
15 Dim nsMgr As XmlNamespaceManager = New XmlNamespaceManager ( nsTable )
16 nsMgr . AddNamespace ( "xhtml" , "http://www.w3.org/1999/xhtml" )
17 Dim targetTrs As IEnumerable ( Of XElement ) = htmlDoc . XPathSelectElements ( "//xhtml:table[@class = 'o1']//xhtml:tr[@class != 'o1h']" , nsMgr )
18 For Each tr As XElement In targetTrs
19 Dim targetTds As IEnumerable ( Of XElement ) = tr . Elements
20 Dim tdArray As XElement ( ) = targetTds . ToArray
21 Dim region As XElement = tdArray ( 0 )
22 Dim maxTemp As XElement = tdArray ( 6 )
23 xw . WriteStartElement ( "tempData" )
24 xw . WriteAttributeString ( "region" , "" , region . Value )
25 xw . WriteAttributeString ( "maxTemp" , "" , maxTemp . Value )
26 xw . WriteEndElement ( )
27 Next
28 xw . WriteEndElement ( )
29 xw . Close ( )
30 End Sub
31
32 Function CreateXmlWriter ( outputPath As String ) As XmlWriter
33 Dim settings As XmlWriterSettings = New XmlWriterSettings ( )
34 settings . CloseOutput = True
35 settings . ConformanceLevel = ConformanceLevel . Document
36 settings . Encoding = UTF8
37 settings . Indent = False
38 settings . NewLineChars = vbCrLf
39 settings . NewLineHandling = NewLineHandling . None
40 settings . OmitXmlDeclaration = False
41 settings . WriteEndDocumentOnClose = False
42 Dim xw As XmlWriter = XmlWriter . Create ( outputPath , settings )
43 Return xw
44 End Function
45
46 End Module
こんなXMLが出ます.(maxTemp.xml)今日は日本列島暑いです.37℃越え(!)のところもあります.
XML
1 <?xml version="1.0" encoding="UTF-8"?>
2 <tempDataRoot>
3 <tempData maxTemp="27.1]" region="札幌"/>
4 <tempData maxTemp="26.9]" region="稚内"/>
5 <tempData maxTemp="26.0]" region="北見枝幸"/>
6 ...
7 <tempData maxTemp="37.1]" region="鹿児島"/>
8 ...
9 <tempData maxTemp="31.3]" region="西表島"/>
10 <tempData maxTemp="33.1]" region="石垣島"/>
11 <tempData maxTemp="" region="昭和"/>
12 </tempDataRoot>
入力はたまたまXHTMLでした.他のダーティーなのでも試した方が良いのでしょうけれども、私の家は冷房なしでこれ以上気力が持ちません... あと普段まずVisual Studioを立ち上げる機会はゼロです.おかしな点があるかもしれません、ご容赦ください.
[追記]
HtmlAgilityPackを使ってみましたが結果は散々でした.
HtmlAgilityPackでもいろいろやった末、以下のコードで動きました.エンコーディングの指定が要るようです.
vb
1 Imports System . Text . Encoding
2 Imports System . Net
3 Imports HtmlAgilityPack
4
5 . . .
6
7 Sub Main ( )
8 Dim xw As XmlWriter = CreateXmlWriter ( "maxTemp.xml" )
9 xw . WriteStartElement ( "tempDataRoot" , "" )
10 Dim wc As WebClient = New WebClient ( )
11 wc . Encoding = UTF8
12 Dim htmlSource As String = wc . DownloadString ( "http://www.data.jma.go.jp/obd/stats/data/mdrr/synopday/data1s.html" )
13 Dim doc As HtmlDocument = New HtmlDocument ( )
14 doc . LoadHtml ( htmlSource )
15 Dim trs = doc . DocumentNode . SelectNodes ( "//table[@class = 'o1']//tr[@class != 'o1h']" )
16 For Each tr In trs
17 Dim tds As IEnumerable ( Of HtmlNode ) = tr . Elements ( "td" )
18 Dim tdArray As HtmlNode ( ) = tds . ToArray
19 Dim regionTd As HtmlNode = tdArray ( 0 )
20 Dim maxTempTd As HtmlNode = tdArray ( 6 )
21 xw . WriteStartElement ( "tempData" )
22 xw . WriteAttributeString ( "region" , regionTd . InnerText )
23 xw . WriteAttributeString ( "maxTemp" , maxTempTd . InnerText )
24 Debug . WriteLine ( "region={0} max-temp={1}" , regionTd . InnerText , maxTempTd . InnerText )
25 xw . WriteEndElement ( )
26 Next
27 xw . WriteEndElement ( )
28 xw . Close ( )
29 End Sub
30
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/08/15 03:11