java - 字符串变量在传递给另一个对象时丢失它们的值

标签 java class variables

我正在尝试构建一个简单的程序来将 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/

相关文章:

java - 如何从java输入时间戳格式到也有格式时间戳的oracle数据库?

python - 列表不在类定义内的方法之间传递

python - 搜索没有 html 标签的漂亮的 soup 输出

Python: 'global' 和 globals().update(var) 之间的区别

java - Mockito 更改非 void 方法的参数值

Java 如何初始化一个列表<element>

java - 正则表达式 - 捕获重复数字(不是数字)

Python 要求将属性转换为字符串

laravel - Laravel Blade 循环中 undefined variable $loop

linux - 如何在 Nginx 配置中使用操作系统环境变量?