AGMedlem sedan mars 20001 266 inlägg Ä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 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. :)
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 ok, tack.
Finns det någon parser inbyggd i Tomcat?
Andreas
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 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 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 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 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
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.