Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用SJXP将属性值和节点值解析为同一个userobject_Java_Xml_Xml Parsing_Sjxp - Fatal编程技术网

Java 使用SJXP将属性值和节点值解析为同一个userobject

Java 使用SJXP将属性值和节点值解析为同一个userobject,java,xml,xml-parsing,sjxp,Java,Xml,Xml Parsing,Sjxp,我试图利用XML,但遇到了需要解析为数据类的XML问题 Data.xml 旅馆 旅馆 酒店 6,68,109,0.85 255,255,255,1 我试着这样做: XmlHandler.java 私有地图类别映射; 私有XMLParser categoryParser=新XMLParser( 新的DefaultRule(IRule.Type.CHARACTER,“/data/article”){ @凌驾 public void handleParsedCharacters(XMLParser

我试图利用XML,但遇到了需要解析为数据类的XML问题

Data.xml

旅馆
旅馆
酒店
6,68,109,0.85
255,255,255,1
我试着这样做:

XmlHandler.java
私有地图类别映射;
私有XMLParser categoryParser=新XMLParser(
新的DefaultRule(IRule.Type.CHARACTER,“/data/article”){
@凌驾
public void handleParsedCharacters(XMLParser解析器、字符串文本、类别){
Log.d(“XmlHandler”、“Hello”);
如果(类别!=null){
categoryMap.put(category.getName(category.LANG.EN),category);
Log.d(“XmlHandler”,“已将类别保存到map.New count=“+categoryMap.values().size());
category.reset();
}否则{
类别=新类别();
Log.d(“XmlHandler”,“创建新类别”);
}
}
},
新类别名称规则()
);
私有类CategoryNameRule扩展了DefaultRule{
私有字符串nameKey=“”;
公共类别名称规则(){
super(Type.ATTRIBUTE,“/data/article/field”,“name”);
}
@凌驾
public void handleParseAttribute(XMLParser解析器,int索引,
字符串值,类别){
nameKey=值;
}
@凌驾
public void handleParsedCharacters(XMLParser解析器、字符串文本、类别){
Log.d(“XmlHandler”,“Handling nameKey=“+nameKey”);
如果(nameKey==null | | nameKey.length()==0){
返回;
}else如果(“name”。等于(nameKey)){
category.setName(category.LANG.EN,text);
}else if(“name_de”.equals(nameKey)){
category.setName(category.LANG.DE,text);
}else if(“name_zh”.equals(nameKey)){
category.setName(category.LANG.ZH,text);
}else if(“color”.equals(nameKey)){
category.colorBackground=getConvertedColor(文本);
}else if(“textcolor”.equals(nameKey)){
category.colorForeground=getConvertedColor(文本);
}
}
}
问题是我的hashmap在整个文档被解析后变成空的,我不知道为什么。我的猜测是我想要一个IRule.Type.CHARACTER和IRule.Type.ATTRIBUTE的组合,但我不知道如何实现

有没有这样的想法/经验?

Stefan, 我很抱歉错过了这个问题(只是在我搜索其他东西时通过谷歌偶然发现的)

这里有几个混淆点,所以让我澄清一下,然后概述我建议如何解决这个问题(假设你没有找到办法,但我知道这是3个月前的事)

首先,您是正确的,您需要字符规则和属性规则的组合。字符规则将为您提供标记之间的内容,例如:

<tag>this is CHARACTER data</tag>
这是字符数据
第二,您的规则应该针对包含所需数据的标记,在上面的示例中,在您到达/data/article/field级别之前,似乎无法获得任何差异化数据(单个字段同时包含所需的属性和字符)

它确实看起来像是你关闭了(打开标签)来告诉你什么时候输入了一篇新文章,这样你就知道你正在为一篇特定的、独特的文章收集字段信息。在这种情况下,当您点击开始标记时,您实际上可以使用标记规则来归档,因此您可以执行一些逻辑,比如在HashMap中为即将解析的新文章创建一条新记录

最后,传递给处理程序的Category参数是一个pass-through用户变量

这意味着您可以调用Parse方法:

XMLParser<List<Article>> p = new XMLParser<List<Article>>(... stuff ...);
List<Article> articleList = new ArrayList<Article>();

p.parse(input, articleList);
XMLParser p=newxmlparser(…stuff…);
List articleList=新建ArrayList();
p、 解析(输入,文章列表);
这允许您的所有处理程序都可以直接访问您的articleList,以便它们可以直接在其中解析/存储信息,这样当parse(…)调用返回时,您就知道您的列表是最新的,并且已更新

如果没有向userObject字段中的parse方法传递任何内容,那么处理程序都将接收空参数

您对类别的使用检查让我感到困惑,并让我认为您希望在调用处理程序时得到一个不断变化的值,但事实并非如此。我只是想澄清一下

摘要

我认为您的完美解析器设计包括3条规则:

  • /数据/项目标记规则——在遇到开始项目标记时(或者在遇到关闭项目标记时)执行某些操作
  • /data/article/field字符规则——存储字段的已解析字符数据
  • /data/article/field属性规则——存储字段的解析属性数据

我希望这有帮助

谢谢你提供的详细信息。我是否正确理解我必须在列表上重复多次?(首先查找文章,然后查找与X匹配的文章)@StefanHoth您不需要对文件进行多次迭代,只需在每个路径中添加尽可能多的规则,就可以在第一次遍历时完全理解该文件。我想我不明白你为什么问这个——也许我在你的请求中遗漏了一个细节,而我在上面没有回答。你能解释一下为什么你认为你需要多次对文件进行iter来解析所有的文章吗?
<tag>this is CHARACTER data</tag>
XMLParser<List<Article>> p = new XMLParser<List<Article>>(... stuff ...);
List<Article> articleList = new ArrayList<Article>();

p.parse(input, articleList);