Hej, Fritt ur minnet, kolla MSDN/hjälpen för mer info. Eller googla efter bättre exempel. Hej, <code> Tack igen, Nu funkar det! En ganska "porrig" lösning är XML-serialisering... Dvs att du skapar objekt som motsvarar XML-filens struktur och på så sätt kan du därefter läsa in hela XML-filen på en gång med i princip en rad kod!Hämta och läsa in extern XML fil
Till att börja med vill jag säga att jag är helt grön på xml....
Jo, jag gör en hemsida för ett företag som skall använda sig av ett externt företag för att få en Newsfeed på hemsidan. Den hämtar automatiskt nyheter från olika källor och skapar en xml-fil som jag ska läsa in och sen loopa igenom och presentera på vår hemsida.
Jag har precis pratat med dom och enligt honom är det ingen webservice, utan dom lägger upp xml-filen på deras server, som jag sedan får läsa in "på lämpligt sätt".
Har aldrig gjort något sånt här förut så:
Hur hämtar jag filen?
Hur läser jag in den?
Hur loopar jag den och presenterar den på min aspx-sida?
Jag använder Visual Studio .NET 2003, och kör VB.NET.
/JockeSv: Hämta och läsa in extern XML fil
<code>
Imports System.Xml
'-----------------------------------------
Dim X as New XmlDocument
X.Load ("http://www.site.se/info.xml")
Dim xnArtiklar As XmlNodeList
Dim artikel as XmlNode
xnArtiklar = X.DocumentElement.SelectNodes ( "Artikel")
For Each artikel In xnArtiklar
response.write ( artikel.InnerText & "<br>" )
Next
</code>
Förutsätter XML-struktur enligt nedan:
<InfoRoot>
<Artikel>bla bla bla... </Artikel>
<Artikel>bla bla bla... </Artikel>
<Artikel>bla bla bla... </Artikel>
</InfoRoot>
Det kan göras snyggare och mer dynamiskt med XSLT..
men det kanske är lite mycket att hugga in i om du är helt ny på XML.Sv:Hämta och läsa in extern XML fil
Tack för svaret!
Får det inte riktigt att funka.
Så här ser xml-filen ut:
<?xml version="1.0" encoding="ISO-8859-1" ?>
- <rss version="2.0">
- <channel>
<title>RSS 2.0 Output</title>
<link>http://www.newslerantoren.se</link>
<description>RSS Feed for user</description>
<language>en-us</language>
<copyright>Copyright 2005 Newsforetaget AB</copyright>
<docs>http://www.newsforetaget.se</docs>
<lastBuildDate>Thu, 20 Apr 2006 11:23:34 GMT</lastBuildDate>
- <item>
<title>Rubrik 1 här</title>
<description>Ingress till ettan här</description>
<agent>Renovering</agent>
<link>http://www.lanktillnyheten.se</link>
<author>Sveriges Radio</author>
<pubDate>Wed, 19 Apr 2006 15:18:38</pubDate>
</item>
- <item>
<title>Rubrik 2 här</title>
<description>Ingress till 2:an här</description>
<agent>Renovering</agent>
<link>http://lanktillnyheten.com</link>
<author>Hällekis-Kuriren</author>
<pubDate>Wed, 19 Apr 2006 14:22:19</pubDate>
</item>
- <item>
<title>Rubrik 3 här</title>
<description>Ingress till 3:an här</description>
<agent>Renovering</agent>
<link>http://lanktillnyheten.com</link>
<author>Hällekis-Kuriren</author>
<pubDate>Wed, 19 Apr 2006 14:22:19</pubDate>
</item>
- <item>
<title>Rubrik 4 här</title>
<description>Ingress till 2:an här</description>
<agent>Renovering</agent>
<link>http://lanktillnyheten.com</link>
<author>Hällekis-Kuriren</author>
<pubDate>Wed, 19 Apr 2006 14:22:19</pubDate>
</item>
</channel>
</rss>
Det är det som är inom varje "<item></item>" jag vill lista hos mig.
Tacksam för lite hjälp!
/Jocke
Sv: Hämta och läsa in extern XML fil
xnArtiklar = X.DocumentElement.SelectNodes ( "item")
For Each artikel In xnArtiklar
response.Write ( GetNodeText (artikel, "title") )
response.Write ( GetNodeText (artikel, "description") )
' osv ...
Next
Function GetNodeText(parentNode As XmlNode, name As String) As String
Dim nod as XmlNode = parentNode.SelectsingleNode (name)
If not nod Is Nothing Then Return nod.InnerText
End Function
</code>Sv:Hämta och läsa in extern XML fil
Det funkar inte riktigt.
Så här är ser all min kod ut:(xml-dokumentet som ovan)
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim X As New XmlDocument
X.Load("http://minurl/xmlfil.xml")
Dim xnArtiklar As XmlNodeList
Dim artikel As XmlNode
xnArtiklar = X.DocumentElement.SelectNodes("item")
For Each artikel In xnArtiklar
Response.Write(GetNodeText(artikel, "title"))
Response.Write(GetNodeText(artikel, "description"))
' osv ...
Next
End Sub
Function GetNodeText(ByVal parentNode As XmlNode, ByVal name As String) As String
Dim nod As XmlNode = parentNode.SelectsingleNode(name)
If Not nod Is Nothing Then Return nod.InnerText
End Function
Den hittar xml dokumentet, men när man kommer ner till loopen så är counten på "xnArtiklar" 0(noll).
Med andra ord startar aldrig loopen.
Fattar inte riktigt...?
/Jocke
Sv: Hämta och läsa in extern XML fil
Felet var på raden:
xnArtiklar = X.DocumentElement.SelectNodes("item")
Det skall vara:
xnArtiklar = X.DocumentElement.SelectNodes("/rss/channel/item")
Tack för hjälpen!!
/JockeSv: Hämta och läsa in extern XML fil
Dock kräver det lite knåpande för att få till klasserna så att dom matchar XML-datat (man kan styra vilka taggar/attribut som ska motsvara vilka properties/variabler osv...
I fallet med RSS skulle man kunna tänka sig följande klasser (ungefär) direkt ur huvet utan att testa:
[XmlRoot("rss")]
public class RSS
{
[XmlAttribute("version")]
public Version;
[XmlArray("Channel")]
[XmlArrayItem("item", typeof("RssItem")]
public RssItemCollection items;
}
public class RssItemCollection : CollectionBase
{
public RssItem this[int index]
{
get { return (RssItem)List[index]; }
set { List[index] = value;
}
public void Add(RssItem value)
{
List.Add(value);
}
}
public class RssItem
{
[XmlElement("title")]
public string Title;
[XmlElement("description")]
public string Description;
[XmlElement("agent")]
public string Agent;
[XmlElement("link")]
public string Link;
[XmlElement("author")]
public string Author;
[XmlElement("pubDate")]
public string PubDate;
}
När du definierat klart klasserna så deserialiserar du in XML-datat ungefär såhär:
TextReader reader = new ..... (instansera valfri instans av en inström)
XmlSerializer serializer = new XmlSerializer(typeof(RSS));
RSS rssData = (RSS)serializer.DeSerialize(reader);
Sen har du hela RSS-dokumentet i variabeln rssData och kan enkelt komma åt datat...
(obs! Koden är absolut inte fullständig och den är i c#-liknande.. har inte pillat med VB.NET på ett tag... )