我正在尝试构建一个简单的程序来将 xml 文件转换为对象,反之亦然用于学校项目。我正在尝试将从标签之间获取的 xml 数据存储到一个对象中,然后将该对象存储到另一个类的另一个对象中。问题是,每次我尝试将一些字符串从 xml 解析传递到第一个存储对象(例如名称、平台等)时,它们都会丢失它们的值。该字符串确实被传送到存储对象,但存储只是从“XXXXXX”变为“”。我们的 theacer 和我都无法解决这个问题。有什么想法吗?
这是造成破坏的类。
public class MySaxParser
extends DefaultHandler {
public static int element;
public static String elementit[] = {"name","studio","genre","platform","published"};
public static String Name, Studio, Genre, Platform, Published;
public static OutFile outF = new OutFile();
private static Library Pelit = new Library();
private static Game peli;
public Library getLib(){
return Pelit;
}
public void parse() {
/*if (args.length != 1) {
System.out.println("Usage: java .MySaxParser [URI]");
System.exit(0);
}*/
// oli public static ja metodin ulkopuolella
System.setProperty("javax.xml.parsers.SAXParserFactory",
"org.apache.xerces.jaxp.SAXParserFactoryImpl");
//String uri = args[0];
String uri = "src\\gamelib\\Gamelibrary.xml";
try {
if (outF.askName())
outF.openFile(); // ok, avataan tiedosto
SAXParserFactory parserFactory = SAXParserFactory.newInstance();
parserFactory.setValidating(true);
parserFactory.setNamespaceAware(false);
parserFactory.setFeature(
"http://apache.org/xml/features/validation/schema", true);
MySaxParser MySaxParserInstance = new MySaxParser();
SAXParser parser = parserFactory.newSAXParser();
parser.parse(uri, MySaxParserInstance);
}
catch (IOException exception) {
exception.printStackTrace();
}
catch (SAXException exception) {
exception.printStackTrace();
}
catch (ParserConfigurationException exception) {
exception.printStackTrace();
}
catch (FactoryConfigurationError exception) {
exception.printStackTrace();
}
System.out.println("Prasing done.");
}
public void characters(char[] ch, int start, int length) throws SAXException {
String s = new String(ch, start, length);
s = s.trim();
switch(element){
case 1:
peli.setName(s);
break;
case 2:
peli.setStudio(s);
break;
case 3:
peli.setGenre(s);
break;
case 4:
peli.setPlaform(s);
break;
case 5:
peli.setPublished(s);
break;
//outF.write(s); jos halutaan printata tiedostoon nin tämä käyttöön
}
}
public void endDocument() throws SAXException {
}
public void endElement(String url, String localName, String qName) throws
SAXException {
System.out.println("Loppuva elementti: "+qName);
if (qName.equals("game"))
Pelit.AddGame(peli);
}
public void startDocument() throws SAXException {
}
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
System.out.println("Alkava elementti: "+qName);
switch(qName){
case "name":
element = 1;
break;
case "studio":
element = 2;
break;
case "genre":
element = 3;
break;
case "platform":
element = 4;
break;
case "published":
element = 5;
break;
case "game":
peli = new Game();
break;
}
}
public void fatalError(SAXParseException e) throws SAXException {
throw new java.lang.UnsupportedOperationException(
"Method fatalError() not yet implemented.");
}
和存储类。
public class Game {
private static String Name, Studio, Genre, Plaform, Published;
public String getName() {return Name;}
public String getStudio() {return Studio;}
public String getGenre() {return Genre;}
public String getPlaform() {return Plaform;}
public String getPublished() {return Published;}
public void setName(String Name) {this.Name = Name;}
public void setStudio(String Studio) {this.Studio = Studio;}
public void setGenre(String Genre) {this.Genre = Genre;}
public void setPlaform(String Plaform) {this.Plaform = Plaform;}
public void setPublished(String Published) {this.Published = Published;}
}
我调试了无数次代码,用它尝试了一些难以形容的事情,现在我一无所知。
一次澄清。调试显示 peli.setName(s)
确实执行了正确的值 - 让我们说“Derp” - 它确实注册到 Game.Name
,但值从“Derp”到“”,如果我在调试中更进一步。
最佳答案
重要:在重写的方法之前添加@Override,例如startElement
。如果您在签名中有错误,编译器错误会说:不覆盖任何方法。现在使用错误的参数类型,将调用 DefaultHandler 的 startElement。
此外 characters
可能被调用不止一次:
持有一个字符串变量
private StringBuilder elementValue;
在 startElement 中做:
elementValue = new StringBuilder()
在字符中,没有修剪:
elementValue.append(s);
然后在 endElement 中用现在的字符保存它
peli.setName(elementValue.toString());
这是因为你有没有内部标签的叶元素。
关于java - 字符串变量在传递给另一个对象时丢失它们的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21163301/