- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
有一个简单的xml,格式如下
<configuration>
<property>
<name>crawling.depth</name>
<value>1</value>
<description/>
</property>
<property>
<name>video.appid</name>
<value>2</value>
<description>Value modified @25-06-2014 11:37:28.731</description>
</property>
</configuration>
在启动应用程序时,我生成一个 ID 并在 XML 的 video.appid 属性中设置相同的 ID。
我正在使用一个简单的 DOM 解析器,并且 XML 得到正确更新,但在重复启动过程中,注意到两个属性之间的空格被添加。经过五次左右的修改后,该文件如下所示。
<configuration>
<property>
<name>crawling.depth</name>
<value>1</value>
<description/>
</property>
<property>
<name>video.appid</name>
<value>2</value>
<description>Value modified @25-06-2014 12:30:18.125</description>
</property>
</configuration>
我删除了该属性并将其重新添加到 XML 中,我猜这就是问题所在。在写回时有什么方法可以重新格式化整个文件吗?这样就可以避免出现空行。
尝试用谷歌搜索它,只得到缩进相关信息,这不是这里的问题。
提前致谢。
编辑:执行更新的代码:
public static boolean updatePropInFile(File file, Map propMap){
boolean success = false;
try {
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.parse(file);
NodeList props = doc.getElementsByTagName("property");//No I18N
List<Element> elements = new ArrayList<Element>();
for(int i=0;i<props.getLength();i++){
Element prop = (Element)props.item(i);
Element nme = (Element)prop.getElementsByTagName("name").item(0);//No I18N
String propName = nme.getTextContent();
Iterator it = propMap.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pairs = (Map.Entry)it.next();
if(pairs.getKey().equals(propName)){
prop.getParentNode().removeChild(prop);
i--;
}
}
}
Iterator it = propMap.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pairs = (Map.Entry)it.next();
elements.add(createPropertyElement(doc,String.valueOf(pairs.getKey()),String.valueOf(pairs.getValue())));
}
Node root = doc.getElementsByTagName("configuration").item(0);//No I18N
for(Element ele:elements){
root.appendChild(ele);
}
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");//No I18N
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");//No I18N
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(file);
transformer.transform(source, result);
success=true;
} catch (Exception pce) {
success=false;
}
return success;
}
最佳答案
试试这个。添加转换器以在修改后格式化您的 xml。
public class ParseXml {
public static void main(String[] args) {
System.out.println("Started XML modification");
try {
DocumentBuilderFactory factory = DocumentBuilderFactory
.newInstance();
DocumentBuilder docBuilder = factory.newDocumentBuilder();
Document xmlDoc;
xmlDoc = docBuilder.parse(new File("sample.xml"));
NodeList nodes = xmlDoc.getElementsByTagName("fr");
for (int i = 0, length = nodes.getLength(); i < length; i ++) {
((Element)nodes.item(i)).setTextContent("Modified");
}
xmlDoc.getDocumentElement().normalize();
TransformerFactory transformerFactory = TransformerFactory
.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(
"{http://xml.apache.org/xslt}indent-amount", "4");
DOMSource domSource = new DOMSource(xmlDoc);
StreamResult result = new StreamResult(new File("sample.xml"));
transformer.transform(domSource, result);
System.out.println("Modification Done");
} catch (Exception e) {
e.printStackTrace();
}
}
}
实际 xml:Sample.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<titles>
<tome>
<de>DE1</de>
<fr>Actual value</fr>
<en>EN1</en>
</tome>
<valhalla>
<de>DE2</de>
<fr>Actual value</fr>
<en>EN2</en>
</valhalla>
<vikings>
<de>DE3</de>
<fr>Actual value</fr>
<en>EN3</en>
</vikings>
</titles>
Java 类的输出:修改后的 Xml:Sample.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<titles>
<tome>
<de>DE1</de>
<fr>Modified</fr>
<en>EN1</en>
</tome>
<valhalla>
<de>DE2</de>
<fr>Modified</fr>
<en>EN2</en>
</valhalla>
<vikings>
<de>DE3</de>
<fr>Modified</fr>
<en>EN3</en>
</vikings>
</titles>
更新:
不确定为什么格式化的 xml 中会出现空格。需要知道你的 createPropertyElement() 的作用。现在您可以使用 xsl 删除父标记之间的空格,
TransformerFactory transformerFactory = TransformerFactory
.newInstance();
Transformer transformer = transformerFactory.newTransformer(new StreamSource("sample.xsl"));
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(
"{http://xml.apache.org/xslt}indent-amount", "4");
DOMSource domSource = new DOMSource(xmlDoc);
StreamResult result = new StreamResult(new File("sample.xml"));
transformer.transform(domSource, result);
样本.xsl
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
关于java - 使用 DOM 解析器更新 xml 文件时创建的新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24402110/
SQLite、Content provider 和 Shared Preference 之间的所有已知区别。 但我想知道什么时候需要根据情况使用 SQLite 或 Content Provider 或
警告:我正在使用一个我无法完全控制的后端,所以我正在努力解决 Backbone 中的一些注意事项,这些注意事项可能在其他地方更好地解决......不幸的是,我别无选择,只能在这里处理它们! 所以,我的
我一整天都在挣扎。我的预输入搜索表达式与远程 json 数据完美配合。但是当我尝试使用相同的 json 数据作为预取数据时,建议为空。点击第一个标志后,我收到预定义消息“无法找到任何内容...”,结果
我正在制作一个模拟 NHL 选秀彩票的程序,其中屏幕右侧应该有一个 JTextField,并且在左侧绘制弹跳的选秀球。我创建了一个名为 Ball 的类,它实现了 Runnable,并在我的主 Draf
这个问题已经有答案了: How can I calculate a time span in Java and format the output? (18 个回答) 已关闭 9 年前。 这是我的代码
我有一个 ASP.NET Web API 应用程序在我的本地 IIS 实例上运行。 Web 应用程序配置有 CORS。我调用的 Web API 方法类似于: [POST("/API/{foo}/{ba
我将用户输入的时间和日期作为: DatePicker dp = (DatePicker) findViewById(R.id.datePicker); TimePicker tp = (TimePic
放宽“邻居”的标准是否足够,或者是否有其他标准行动可以采取? 最佳答案 如果所有相邻解决方案都是 Tabu,则听起来您的 Tabu 列表的大小太长或您的释放策略太严格。一个好的 Tabu 列表长度是
我正在阅读来自 cppreference 的代码示例: #include #include #include #include template void print_queue(T& q)
我快疯了,我试图理解工具提示的行为,但没有成功。 1. 第一个问题是当我尝试通过插件(按钮 1)在点击事件中使用它时 -> 如果您转到 Fiddle,您会在“内容”内看到该函数' 每次点击都会调用该属
我在功能组件中有以下代码: const [ folder, setFolder ] = useState([]); const folderData = useContext(FolderContex
我在使用预签名网址和 AFNetworking 3.0 从 S3 获取图像时遇到问题。我可以使用 NSMutableURLRequest 和 NSURLSession 获取图像,但是当我使用 AFHT
我正在使用 Oracle ojdbc 12 和 Java 8 处理 Oracle UCP 管理器的问题。当 UCP 池启动失败时,我希望关闭它创建的连接。 当池初始化期间遇到 ORA-02391:超过
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve
引用这个plunker: https://plnkr.co/edit/GWsbdDWVvBYNMqyxzlLY?p=preview 我在 styles.css 文件和 src/app.ts 文件中指定
为什么我的条形这么细?我尝试将宽度设置为 1,它们变得非常厚。我不知道还能尝试什么。默认厚度为 0.8,这是应该的样子吗? import matplotlib.pyplot as plt import
当我编写时,查询按预期执行: SELECT id, day2.count - day1.count AS diff FROM day1 NATURAL JOIN day2; 但我真正想要的是右连接。当
我有以下时间数据: 0 08/01/16 13:07:46,335437 1 18/02/16 08:40:40,565575 2 14/01/16 22:2
一些背景知识 -我的 NodeJS 服务器在端口 3001 上运行,我的 React 应用程序在端口 3000 上运行。我在 React 应用程序 package.json 中设置了一个代理来代理对端
我面临着一个愚蠢的问题。我试图在我的 Angular 应用程序中延迟加载我的图像,我已经尝试过这个2: 但是他们都设置了 src attr 而不是 data-src,我在这里遗漏了什么吗?保留 d
我是一名优秀的程序员,十分优秀!