「xml转java」xml转java实体类
本篇文章给大家谈谈xml转java,以及xml转java实体类对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、从XML变成View,它经历了什么?
- 2、java怎样读取解析xml文件中的数据转换成java对象
- 3、如何将xml文件转变成java对象
- 4、xml怎么转为java对象,急啊!!!!在线等
- 5、xtream的工具使用
从XML变成View,它经历了什么?
码个蛋(codeegg)第 626 次推文
作者:看我眼前007
原文:
友情提示:
本文篇幅较长,建议在电脑上慢慢阅读~
写作背景
Android 开发框架中,使用 Xml 文件描述 Ui 页面,通过setContentView(resId)或者LayoutInflater.inflate(resId,……)的方式把 Xml 文件描述的页面转换成 Java 对象。Xml 文件加上 AndroidStudio 提供的预览功能,使得 Android 开发过程中页面和业务逻辑可以并行开发,极大地提高了开发效率。
但是大部分 Android 工程师对 xml 文件如何转换成 Java 不是十分了解,本文将带大家一起探究 View 从 xml 文件到 Java 对象的转换过程
我们先罗列一下 xml 转换成 Java 对象的方式
我们一般在项目使用的 Activity 可能是
所有的 Activity 都是 android.app.Activity 的子类。
但是!每个继承 android.app.Activity 的子类 setContentView(resId) 实现方式都被重载了。我们这里先看最基础的 android.app.Activity
查看一下 getWindow源码
全局搜索 mWindow 对象赋值的地方找到以下代码
这里 PhoneWindow 的源码在 sdk 里面是隐藏的,我们去 androidxref -PhoneWindow.java 查看 PhoneWindow.setContentView(layoutResID)
当我们没有设置转场动画的时候会执行
在 PhoneWindow 的构造函数中我们找到了 mLayoutInflater 对象赋值语句
所以我们得出一个结论
Activity.setContentView(resId) 最终还是使用
LayoutInflater.from(context).inflate(resId, ……)
再回头看下
android.support.v7.app. AppCompatActivity 和
android.support.v4.app. FragmentActivity
我们发现
android.support.v4.app. FragmentActivity 没有重载
android.app.Activity. setContentView (resId),
但是 android.support.v7.app. AppCompatActivity 重载了
再跟踪一下源代码我们发现最终会调用到
android.support.v7.app. AppCompatDelegateImplV9 . setContentView (resId)
这里我们又发现了 LayoutInflater的身影。
这里我们可以总结一下:
xml 转成成 Java对象是通过 LayoutInflater的inflate 方法来完成的。
LayoutInflater对象实例化
看一下 LayoutInflater的源码第一行
LayoutInflater 是一个抽象类, 抽象类是不能实例化的
看 Activity 的 getLayoutInflater
这里我们就可以看出 Activity 通过 getLayoutInflater 获取的是 PhoneWindow 的 mLayoutInflater (如果忘记了可以往上翻一下,或者去参考资料的链接里找找源码)
再看一下 LayoutInflater.from(context)
此时,我们必须请出柯南君帮我们宣布
真相只有一个!最终都是通过服务获取 LayoutInflater实例对象。
所以我们直接查看:
ContextImpl.getSystemService(Context.LAYOUT_INFLATER_SERVICE)
继续跟踪 SystemServiceRegistry
这时候我们在 SystemServiceRegistry 类停留一下,发现这里似乎只注册各种系统服务的地方。
我们找到了
Context . LAYOUT_INFLATER_SERVICE 注册代码。
然后我们终于找到 LayoutInflater的实现类是 PhoneLayoutInflater
此时我们可以休息一下,喝口水,上个卫生间,进入下个阶段~
读取xml文件并创建View对象
再去源码查看一下,发现两个方法其实只有一个方法是核心,另一个只是做了一下封装,让我们少传入一个参数。
所以我们重点看一下 inflate(@LayoutRes int resource, @able ViewGroup root, boolean attachToRoot) 的源码
我们看到首先通过 res 对象把 resId 指向的 xml 文件转换为 XmlResourceParser 然后执行 inflate(parser, root, attachToRoot) 方法,该方法比较长,这里只贴出核心步骤。
以上步骤还是很长,我们将拆分几部分分析。
如果 xml 根标签是 merge,则 root 不能为空, attachToRoot 必须是 true。
然后执行 rInflate(parser, root, inflaterContext, attrs, false)
上面这个方式我们需要重点记一下
如果子节点是 include,则执行 parseInclude。
parseInclude的源码和 inflate(parser, root, attachToRoot)类似,都是读取xml对应的文件,转换成 XmlResourceParser 然后遍历里的标签。
经过层层调用,我们可以找到最终创建 View 的代码
第一部分代码,我们的到的结论是,
createViewFromTag(parent, name, context, attrs)负责创建 View 对象。
因为这里排除了merge标签,这里的根标签肯定是一个 View,所以调用了 createViewFromTag(root, name, inflaterContext, attrs)方法创建 View 。
再次印证了第一部分得出的结论 createViewFromTag (parent, name, context, attrs)负责创建 View 对象。
然后看下后面的代码我们就明白
inflate(@LayoutRes int resource, @able ViewGroup root, boolean attachToRoot) 三个参数的关系了
创建 View 对象
通过上面的判断我们终于找到了最最核心的方法 createViewFromTag
有包裹了一层,并且把 ignoreThemeAttr 设置为 false,表示这里会收到 Theme 的影响。
我们在 createViewFromTag(parent, name, context, attrs, false) 中找到了创建 View 的代码
这里又出现了 mFactory2、mFactory、mPrivateFactory 三个对象,似乎都是可以创建 View 。 对于android.app.Activity来说,这三个对象为 或者空实现(下一节会讲这个) 所以我们直接看
这里需要说明一下,如果 name属性里面含有 . 表示这是一个自定义 View,系统自带 View 我们可以省略类的路径,而自定义 View 则不能省略。
对于自定义 View 的创建,这里省略了大部分代码
仅仅看到 constructor . newInstanc e(args) ,我们已经明白这里使用了 反射创建 View 对象。
而对于 Android 内置的各种 View, 我们在 LayoutInflater 的实现类 PhoneLayoutInflater 中找到了重载
再看下 LayoutInflater 中的代码
我们可以看到, 对于系统内置的 View,会依次在 View 的标签前面加上
"android.widget."、"android.webkit."、"android.app." 、"android.view."
然后通过 反射 的方法 创建 View 。
(文章略有删减,可点击原文查看~)
到此 ,Xml 到 View 对象的转换过程全部结束~~~
看到这里的童鞋很辛苦!这项技能get了吗?
近期文章:
今日问题:
谁能来画个过程图?
画出来有信心的丢到码仔的学习群来,码仔给你发红包!
快来码仔社群解锁新姿势吧!社群升级:Max你的学习效率
java怎样读取解析xml文件中的数据转换成java对象
SAXBuilder sb = new SAXBuilder();//建立构造器
Document doc;
try {
doc = sb.build("E:/userinfod301.xml"); //读入指定文件
Element root = doc.getRootElement();//获得根节点
List list = root.getChildren();//将根节点下的所有ObjectInstance子节点放入List中
for (int i = 0; i list.size(); i++) {
ListElement listNext = ((Element) list.get(i)).getChildren();//将ObjectInstance节点下的所有Attribute放入List中
for (int j = 0; j listNext.size(); j++) {
Element sub = (Element) listNext.get(j);//取得节点实例
System.out.println(sub.getAttribute("name").getValue());
System.out.println(sub.getText());
}
}
} catch (Exception e) {
e.printStackTrace();
}
如何将xml文件转变成java对象
首先 java是面向对象的编程语言,所以你要理解面向对象的思想。在这个前提下我们可以理解 文件 本身就是java的对象File,而xml只是File类中对象的一种实例。你可以创建一个File 把你的xml的路径传入这个对象的有参构造,这样就实例化了一个xml文件类的对象
xml怎么转为java对象,急啊!!!!在线等
要自己解析啊,
把xml文本加载进来,一层一层的解析,然后
A a = new A();
a...=...;
xtream的工具使用
Xstream
需要的jar包
xpp3_min-1.1.4c.jar
xstream-1.3.1.jar
作用:
将xml字符串转换为java对象,或者将java对象转换为xml字符串
核心类:XStream xs = new XStream();
准备工作,先创建两个java类:City和Province
@XStreamAlias("city")
public class City {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@XStreamAlias("province")
public class Province {
@XStreamAsAttribute()
private String name;
@XStreamImplicit(itemFieldName = "city")
private List citys;
public List getCitys() {
return citys;
}
public void setCitys(List citys) {
this.citys = citys;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
第一:将java类转换为xml字符串
XStream xs = new XStream();
String xml = xs.toXML(JavaBean);
打印的字符串会将类的包名作为xml的标签,以及里面的字段都会变成标签。
例如将City类变为xml字符串:
武汉
将Province变成xml字符串
湖北
武汉
所以为了能将打印的字符串变为我们所想要的格式,可以使用Xstream提供的注解进行格式化输出
提供便捷注解
@XStreamAlias(别名) 对类和变量设置别名
@XStreamAsAttribute 设置变量生成属性
@XStreamOmitField 设置变量 不生成到XML
@XStreamImplicit(itemFieldName = “hobbies”) 设置集合类型变量 别名
使注解生效
xStream.autodetectAnnotations(true);
第二:将xml字符串变为java对象
Object xs.fromXML(InputStream input); //将一个下买了指定的流变为java对象
Object xs.fromXML(String xml) //将xml字符串变为java对象
Object xs.fromXML(InputStream input,Object root) ?
Object xs.fromXML(String xml,Object root) ?
注意:转换的xml文档必须与Java对象 的格式对应
例如:将下面xml字符串转换为Java对象
武汉
则进行转换时候:
XStream xs = new XStream();
Object o = xs.fromXML(in);
若对应的java格式一定是:
包名为:com.domain
类名为:City
里面有一个成员属性:name 提供setter/getter方法
若不是则可以使用别名:
a.为类设置别名
xs.alias("city", City.class);
b.为属性添加别名
xstream.useAttributeFor(Blog.class,"author");
能不能通过注解将 xml转换为制定的java对象 ?
能,手动用方法添加别名
xml转java的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于xml转java实体类、xml转java的信息别忘了在本站进行查找喔。
发布于:2022-12-01,除非注明,否则均为
原创文章,转载请注明出处。