string 转化xml xml转化为string

本文介绍了四种不同的XML处理方法:使用标准的JDK API (javax.xml.parsers)、dom4j、JDOM以及JavaScript。每种方法都提供了从字符串到XML文档及反向转换的示例代码,并特别注意了中文字符的正确处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、使用最原始的javax.xml.parsers,标准的jdk api 

 

// 字符串转XML 

 


String xmlStr = \"......\";  

StringReader sr = new StringReader(xmlStr); 

InputSource is = new InputSource(sr); 

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 

DocumentBuilder builder=factory.newDocumentBuilder();  

Document doc = builder.parse(is);  


//XML转字符串 

TransformerFactory  tf  =  TransformerFactory.newInstance();  

Transformer t = tf.newTransformer();  

t.setOutputProperty(\"encoding\",\"GB23121\");//解决中文问题,试过用GBK不行 

ByteArrayOutputStream  bos  =  new  ByteArrayOutputStream(); 

t.transform(new DOMSource(doc), new StreamResult(bos));  

String xmlStr = bos.toString();  

这里的XML DOCUMENT为org.w3c.dom.Document 

 

  二、使用dom4j后程式变得更简单 

 

// 字符串转XML  

String xmlStr = \"......\";  

Document document = DocumentHelper.parseText(xmlStr);  

  

// XML转字符串  

Document document = ...;  

String text = document.asXML();  

  

这里的XML DOCUMENT为org.dom4j.Document  

  三、使用JDOM 

 

JDOM的处理方式和第一种方法处理很类似 

 

//字符串转XML  

String xmlStr = \".....\";  

StringReader sr = new StringReader(xmlStr); 

InputSource is = new InputSource(sr); 

Document doc = (new SAXBuilder()).build(is); 

  

//XML转字符串  

Format format = Format.getPrettyFormat();  

format.setEncoding(\"gb2312\");//配置xml文档的字符为gb2312,解决中文问题 

XMLOutputter xmlout = new XMLOutputter(format); 

ByteArrayOutputStream bo = new ByteArrayOutputStream(); 

xmlout.output(doc,bo);  

String xmlStr = bo.toString();  

  

这里的XML DOCUMENT为org.jdom.Document  

 四、JAVASCRIPT中的处理 

 

//字符串转XML  

var xmlStr = \".....\";  

var xmlDoc = new ActiveXObject(\"Microsoft.XMLDOM\"); 

xmlDoc.async=false;  

xmlDoc.loadXML(xmlStr);  

//能够处理这个xmlDoc了  

var name = xmlDoc.selectSingleNode(\"/person/name\"); 

alert(name.text);  

  

//XML转字符串  

var xmlDoc = ......;  

var xmlStr = xmlDoc.xml  

  

这里的XML DOCUMENT为javascript版的XMLDOM  


 

<think>我们遇到的问题是:在`SynchronizableEntity`的`getEndpoint`方法中,我们尝试从资源文件(String.xml)中获取一个字符串资源,资源名称的构成是:`"url_"+type+"_"+this.getClass().getSimpleName()`。但是,在日志中我们看到一个警告:`R绫绘湭鎵惧埌:com.example.kucun2.R$String`,这实际上是“R类未找到”的乱码,同日志显示获取的端点为null。根据最新的信息,问题可能出在类名的大小写上。因为我们在资源文件中定义的字符串名称是小写(例如:`url_add_dingdan`),而`getClass().getSimpleName()`返回的类名可能是大写开头(例如:`Dingdan`),这样组合起来的资源名就是`url_add_Dingdan`(注意D是大写),而资源文件中的名称可能是`url_add_dingdan`(全部小写),因此导致资源查找失败。解决方案:1.将类名转化为小写,确保资源名称匹配。2.在资源文件中,保持URL资源名称全部使用小写(或统一使用与代码中一致的命名规范)。修改`SynchronizableEntity`的`getEndpoint`方法,将类名转换为小写:具体修改如下:```javapublicabstractclassSynchronizableEntityimplementsEntityClassGrassrootsid{/***添加url*@paramtype操作增删改查*@return返回相对url*/publicStringgetEndpoint(Stringtype){//将类名转化为小写,以确保与资源文件中的名称匹配StringclassName=this.getClass().getSimpleName().toLowerCase();StringresourceName="url_"+type+"_"+className;Log.d("getEndpoint","Tryingtogetresource:"+resourceName);Stringurl=MyAppFnction.getStringResource("String",resourceName);Log.d("getEndpoint","Endpoint:"+url);returnurl;}}```这样,生成的资源名称就会是全部小写,例如:`url_add_dingdan`,与资源文件中的名称保持一致。同,请检查资源文件(如:`res/values/strings.xml`)是否正确定义了所有需要的URL资源。例如:```xml<resources><stringname="url_add_dingdan">https://tian.sef/Kucun2/app/dingdan/add</string><stringname="url_update_dingdan">https://tian.sef/Kucun2/app/dingdan/update</string><!--其他实体类的URL--></resources>```注意:如果资源文件中已经存在的是大写开头的类名(如`url_add_Dingdan`),那么我们需要统一调整为小写。但通常资源文件中我们习惯使用小写字母和下划线。此外,我们还需要在`SynchronizedList.syncEntity`方法中加入对endpoint为空的防御,避免NPE:```javaprivatevoidsyncEntity(Tentity){if(batchMode)return;Stringoperation="add";ToriginalEntity=getOriginal(entity);Stringendpoint=originalEntity.getEndpoint(operation);Log.d("getEndpoint","endpoint:"+endpoint);if(endpoint==null||endpoint.isEmpty()){Log.e("SynchronizedList","Endpointisnulloremptyforoperation:"+operation+",entity:"+entity.getClass().getSimpleName());return;}//...其余代码不变...}```这样,即使资源获取失败,也不会导致程序崩溃,而是记录错误并跳过此次同步。为了彻底解决,我们还需要确保所有实体的URL资源都在strings.xml中正确定义,且名称均为小写(类名小写)。如果资源名称需要保持一定的大小写规范,那么需要确保代码和资源文件的一致性。我们这里选择全部小写。总结:1.类名转换为小写,以匹配资源文件中的命名(小写)。2.资源文件中定义URL资源名称,全部使用小写。3.添加endpoint为空的检查,避免NPE。注意:之前的乱码日志可能是由于中文字符在日志输出编码问题,但根本原因还是资源查找失败。现在,让我们来回答你之前的问题并给出上述解决方案。另外,关于之前提出的额外问题:1.如何防止在Android资源文件中漏定义URL?-可以在开发阶段进行资源完整性的检查,例如在应用启动检查所有实体类所需的所有URL资源是否存在。如果缺少,则抛出异常或记录错误。2.有什么更健壮的方式来管理网络请求的端点URL?-可以考虑使用一个枚举类或常量类来集中管理所有URL,而不是分散在资源文件中。或者使用一个配置文件(如JSON)在初始化加载。3.为什么`MyAppFnction.getStringResource()`会返回null?-最可能的原因是资源名称不匹配(如大小写问题),或者资源确实没有定义。4.如何处理Android中的`R`类丢失问题?-这通常是由于资源文件存在错误导致R类生成失败。需要检查资源文件的错误,并重新构建项目。下面按照你的要求给出格式化的回答:</think> ### 问题分析与解决方案 您的问题明确指出类名需要转化为小写以确保与 `strings.xml` 中的资源名称匹配。以下是我提供的全面解决方案: #### 修复核心问题:类名大小写转换 ```java public abstract class SynchronizableEntity implements EntityClassGrassrootsid { public String getEndpoint(String type) { // 将类名转换为小写 String className = this.getClass().getSimpleName().toLowerCase(); String resourceName = "url_" + type + "_" + className; String url = MyAppFnction.getStringResource("string", resourceName); // 注意:XML资源类型应为小写 // 添加调试日志和回退机制 if (url == null) { Log.w("SynchronizableEntity", "Resource not found: " + resourceName + ". Using default URL"); return buildDefaultUrl(type, className); } return url; } // 默认URL构建器(防御性编程) private String buildDefaultUrl(String type, String className) { return BASE_URL + "/" + className + "/" + type.toLowerCase(); } } ``` **关键改进点:** 1. `this.getClass().getSimpleName().toLowerCase()` - 强制将类名转换为小写 2. `"string"`(小写)作为资源类型参数 - 匹配XML中的资源类型定义 3. 防御性回退机制,确保资源未找到不会崩溃 4. 统一的默认URL构建逻辑 #### 配套改进:SynchronizedList 增加安全防护 ```java private void syncEntity(T entity) { if (batchMode) return; T originalEntity = getOriginal(entity); String endpoint = originalEntity.getEndpoint("add"); // 新增严格的空值和协议校验 if (endpoint == null || endpoint.isEmpty()) { Log.e("SynchronizedList", "Endpoint is null/empty for: " + entity.getClass().getSimpleName()); return; } if (!endpoint.startsWith("http")) { Log.e("SynchronizedList", "Invalid endpoint format: " + endpoint); endpoint = buildSafeUrl(endpoint); // 添加协议前缀 } // ... 后续请求构建逻辑 ... } private String buildSafeUrl(String endpoint) { return "https://" + endpoint; // 自动添加HTTPS协议 } ``` #### 资源文件规范示例 (strings.xml) ```xml <!-- 所有URL资源使用全小写命名 --> <string name="url_add_dingdan">https://tian.sef/Kucun2/app/dingdan/add</string> <string name="url_update_chanpin">https://tian.sef/Kucun2/app/chanpin/update</string> <string name="url_delete_kucun">https://tian.sef/Kucun2/app/kucun/delete</string> ``` ### 最佳实践建议 1. **资源名称自动化验证** 在Application启动检查所有必需资源 ```java public class MyApp extends Application { @Override public void onCreate() { super.onCreate(); verifyResources(); } private void verifyResources() { String[] requiredResources = { "url_add_dingdan", "url_update_chanpin", // 列出所有必需资源 }; Resources res = getResources(); for (String resName : requiredResources) { int id = res.getIdentifier(resName, "string", getPackageName()); if (id == 0) { Log.e("ResourceCheck", "Missing resource: " + resName); // 可在此处抛出自定义异常中断启动 } } } } ``` 2. **资源加载优化** 在应用启动加载所有URL到内存缓存 ```java public class UrlManager { private static Map<String, String> URL_CACHE = new HashMap<>(); public static void init(Context context) { Resources res = context.getResources(); String packageName = context.getPackageName(); // 获取所有以"url_"开头的资源 Field[] fields = R.string.class.getDeclaredFields(); for (Field field : fields) { if (field.getName().startsWith("url_")) { int id = res.getIdentifier(field.getName(), "string", packageName); URL_CACHE.put(field.getName(), res.getString(id)); } } } public static String getUrl(String resourceName) { return URL_CACHE.get(resourceName); } } ``` 3. **集中式端点管理** 创建专用Endpoint管理类替代散落在各处的资源查找 ```java public enum EntityEndpoint { DINGDAN(R.string.url_add_dingdan, R.string.url_update_dingdan), CHANPIN(R.string.url_add_chanpin, R.string.url_update_chanpin); private final int addResId; private final int updateResId; EntityEndpoint(int addResId, int updateResId) { this.addResId = addResId; this.updateResId = updateResId; } public String getAddUrl(Resources res) { return res.getString(addResId); } public String getUpdateUrl(Resources res) { return res.getString(updateResId); } } ``` ### 问题根源分析 1. **大小写不匹配**:代码中类名未统一为小写,与XML资源的小写要求冲突 2. **资源类型大小写错误**:`"String"` 应改为 `"string"`(XML资源类型必须小写) 3. **防御机制缺失**:原始代码未处理资源查找失败情况 4. **架构缺陷**:端点管理分散在各实体类,导致维护困难 ###
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值