webForumDet fria alternativet

Regex XML

9 svar · 410 visningar · startad av AG

AGMedlem sedan mars 20001 266 inlägg
#1

Är i en något brådska och skulle verkligen uppskatta ifall någon kunde hjälpa mig med en regex.
Jag läser med ett program in en xml-fil.
Ur denna fil skulle jag vilja plocka ut värden, för att senare sätta in i databas.
Filen är uppdelad enligt principen:
<cube name="name_str" value="value_double"/>
<cube name="name_str2" value="value_double2"/>
och fortsätter så.

Jag skulle vilja plocka ut dessa värden, för att som sagt inkludera i en databas, som jag sköter med en böna.

Hur gör jag en sådan regex-loop?

Andreas

SPiNMedlem sedan mars 20007 896 inlägg
#2

Varför använda regexp's? Kan du inte använda någon XML-parser likväl? I så fall rekommenderar jag JDOM, http://www.jdom.org , den är smidig. :)

Aleph_OneMedlem sedan juni 2003372 inlägg
#3

japp håller med SPiN. Använd en XML-parser.

Nåt sånt här kanske:

import java.io.IOException;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
import org.apache.xpath.XPathAPI;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class ParseXML
{
	public ParseXML()
	{
		String file = "conf/cube.xml";
		try
		{
			Document mDocument =
				DocumentBuilderFactory
					.newInstance()
					.newDocumentBuilder()
					.parse(
					file);
			NodeList list = XPathAPI.selectNodeList(mDocument, "cubes/cube");
			for (int i = 0; i < list.getLength(); i++)
			{
				Node node = list.item(i);
				String name =
					node.getAttributes().getNamedItem("name").getNodeValue();
				String value =
					node.getAttributes().getNamedItem("value").getNodeValue();
				System.out.println("name=" + name + ", value=" + value);
			}
		}
		catch (SAXException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		catch (IOException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		catch (ParserConfigurationException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		catch (FactoryConfigurationError e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		catch (TransformerException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public static void main(String[] args)
	{
		new ParseXML();
	}
}

Förutsatt att xml koden ser ut så här, men det är ju lätt att ändra..

<?xml version="1.0" encoding="ISO-8859-1"?>
<cubes>
	<cube name="name_str1" value="value_double"/>
	<cube name="name_str2" value="value_double2"/>
	<cube name="name_str3" value="value_double2"/>
	<cube name="name_str4" value="value_double2"/>
	<cube name="name_str5" value="value_double2"/>
	<cube name="name_str6" value="value_double2"/>
</cubes>
AGMedlem sedan mars 20001 266 inlägg
#4

ok, tack.
Finns det någon parser inbyggd i Tomcat?

Andreas

Aleph_OneMedlem sedan juni 2003372 inlägg
#5

Japp Xerces är med i Tomcat5 iaf.
Vill du använda nån annan parser så är det inte svårare än att du lägger med den jar filen i tomcats common/lib/ om jag kommer ihåg rätt. Eller så lägger du den så att den bara är tillgänglig för din webapp i /WEB-INF/lib/ även om det inte är det smidigaste.

http://xml.apache.org/xerces-j/
http://xml.apache.org/xerces-j/apiDocs/index.html

AGMedlem sedan mars 20001 266 inlägg
#6

Jag har ett konto på www.javaservlethosting.com.
Behöver nåt som fungerar smidigt id en miljön, hur lägger man in jdom på ett sådant ställe?

Andreas

LimeMedlem sedan sep. 2001961 inlägg
#7

På samma sätt som man lägger in allt annat. Man laddar upp det. Om det är en JSP/Servlet-enablad server så är det bara att lasta ner det i lib-katalogen.

AGMedlem sedan mars 20001 266 inlägg
#8

Har laddat hem Jdom nu, men måste erkänna att jag är en fullständig novis. Jag får det helt enkelt inte att fungera. Hur skall jag skapa jar-filen, och är det den som skall in i lib-katalogen?

Andreas

AGMedlem sedan mars 20001 266 inlägg
#9

Verkar nu ha problem med att klippa ut får felet:

org.apache.crimson.parser.EndOfInputException
        at org.apache.crimson.parser.Parser2.fatal(Parser2.java:3182)
        at org.apache.crimson.parser.Parser2.parseInternal(Parser2.java:520)
        at org.apache.crimson.parser.Parser2.parse(Parser2.java:305)
        at org.apache.crimson.parser.XMLReaderImpl.parse(XMLReaderImpl.java:442)

        at org.apache.crimson.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl
.java:185)
        at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:134)
        at xml2.ParseXML.<init>(ParseXML.java:20)
        at xml2.ParseXML.main(ParseXML.java:65)

Vill hämta dagens valuta från:
http://www.ecb.int/stats/eurofxref/eurofxref-hist.xml

Koden som används är

package xml2;

import java.io.IOException;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
import org.apache.xpath.XPathAPI;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class ParseXML
{
	public ParseXML()
	{
		String file = "cube.xml";
		try
		{
			Document mDocument =
				DocumentBuilderFactory
					.newInstance()
					.newDocumentBuilder()
					.parse(
					file);
			NodeList list = XPathAPI.selectNodeList(mDocument, "gesmes:Envelope/Cube/Cube/Cube");
			for (int i = 0; i < list.getLength(); i++)
			{
				Node node = list.item(i);
				String name =
					node.getAttributes().getNamedItem("currency").getNodeValue();
				String value =
					node.getAttributes().getNamedItem("rate").getNodeValue();
				System.out.println("name=" + name + ", value=" + value);
			}
		}
		catch (SAXException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		catch (IOException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		catch (ParserConfigurationException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		catch (FactoryConfigurationError e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		catch (TransformerException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public static void main(String[] args)
	{
		new ParseXML();
	}
}

Andreas

Aleph_OneMedlem sedan juni 2003372 inlägg
#10

Så här kan du hämta dagens.. (ändra från -1 till 0 för att testa mot dagens.. dom hade inte kommit när jag testade.. det är därför som jag satte den att hämta från igår)

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;

import org.apache.xpath.XPathAPI;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class ParseXML
{
	public ParseXML()
		throws
			SAXException,
			IOException,
			ParserConfigurationException,
			FactoryConfigurationError,
			TransformerException
	{
		String url = "http://www.ecb.int/stats/eurofxref/eurofxref-hist.xml";

		Calendar cal = Calendar.getInstance();
		cal.setTime(new Date());
		cal.add(Calendar.DATE, [b]-1[/b]);
		String date = new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime());

		System.out.println("Date: " + date);

		Document mDocument = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(url);
		NodeList list =
			XPathAPI.selectNodeList(mDocument, "Envelope/Cube/Cube[@time='" + date + "']/Cube");

		for (int i = 0; i < list.getLength(); i++)
		{
			Node node = list.item(i);
			String currency = node.getAttributes().getNamedItem("currency").getNodeValue();
			String rate = node.getAttributes().getNamedItem("rate").getNodeValue();
			System.out.println("currency=" + currency + ", rate=" + rate);
		}
	}

	public static void main(String[] args) throws Exception
	{
		new ParseXML();
	}
}

AG skrev:

Har laddat hem Jdom nu, men måste erkänna att jag är en fullständig novis. Jag får det helt enkelt inte att fungera. Hur skall jag skapa jar-filen, och är det den som skall in i lib-katalogen?

Det är precis samma sak som när du kodar en vanlig applikation, för att få tillgång till det extra API du vill använda så måste jar filen komma med i classpathen.. och det gör den i detta fallet om du lägger den i lib katalogen.
Om du har laddat hem jdom så finns det antagligen en jar fil med där.

139 ms totalt · 3 externa anrop · v20260731065814-full.0e50b1ef
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)