- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在开发一个与蓝牙相机接口(interface)的安卓应用程序。对于存储在相机上的每个剪辑,我们在 XML 文件中存储有关剪辑的一些字段(其中一些字段用户可以更改)。
目前这个应用程序是唯一将此 xml 数据写入设备的应用程序,但将来桌面应用程序或 iphone 应用程序也可能会在此处写入数据。我不想假设另一个应用程序也不能有额外的字段(特别是如果他们有一个更新版本的应用程序添加了这个版本尚不支持的新字段)。
所以我想防止的情况是,我们在另一个应用程序中向这个 XML 文件添加新字段,然后用户去使用 android 应用程序,它会删除那些其他字段,因为它不知道它们.
让我们举个假设的例子:
<data>
<title>My Title</title>
<date>12/24/2012</date>
<category>Blah</category>
</data>
当从设备读取时,这将被翻译成一个看起来像这样的 Clip 对象(为简洁起见进行了简化)
public class Clip {
public String title, category;
public Date date;
}
所以我使用 SAX 来解析数据并将其存储到 Clip 中。我只是将字符存储在 StringBuilder 中,并在到达标题、类别和日期的结束元素时将它们写出。
我意识到,当我将这些数据写回设备时,如果原始文档中有任何其他标签,它们将不会被写入,因为我只写出我知道的字段。
这让我觉得 SAX 可能是错误的选择,也许我应该使用 DOM 或其他我可以更轻松地写出最初存在的任何其他元素的东西。
或者我在想,也许我的 Clip 类包含一些通用 XML 类型(可能是 DOM)的 ArrayList,并且在 startTag 中我检查该元素是否不是预定义标签之一,如果是,直到我到达结尾那个标签我存储了整个结构(但是在什么?)..然后写回我会遍历所有额外的标签并将它们写到 xml 文件中(当然还有我知道的字段)
这是已知解决方案的常见问题吗?
-- 2012 年 5 月 22 日更新 --
我没有提到在实际的 xml 根节点(实际上称为注释)中,我们使用已设置为 1 的版本号。短期内我要做的是要求版本我的应用程序支持的数字是 >= xml 数据的版本号。如果 xml 的数量更大,我将尝试解析以进行回读,但会拒绝对模型进行任何保存。尽管关于如何执行此操作,但我仍然对任何类型的工作示例感兴趣。
顺便说一句,我想到了另一个应该很简单的解决方案。我想我可以使用 XPATH 来查找我知道的节点,并在数据更新时替换这些节点的内容。然而,我运行了一些基准测试,当它被解析到内存中时,解析 xml 的开销是荒谬的。仅仅没有进行任何查找的解析操作导致性能比 SAX 差 20 倍。使用 xpath 进行解析通常要慢 30-50 倍,考虑到我在 ListView 中解析这些,这真的很糟糕。所以我的想法是让 SAX 将节点解析为剪辑,但将整个 XML 存储在 Clip 类的一个变量中(记住,这个 xml 很短,不到 2kb)。然后,当我写回数据时,我可以使用 XPATH 替换我在原始 XML 中知道的节点。
但仍然对任何其他解决方案感兴趣。我可能不会接受解决方案,除非它包含一些代码示例。
最佳答案
以下是使用 SAX filters 的方法:
我花了一些时间研究这个想法,它奏效了。它基本上归结为 XMLFilter
的正确链接。方法如下 the unit test看起来,您的代码会做类似的事情:
final SAXParserFactory factory = SAXParserFactory.newInstance();
final SAXParser parser = factory.newSAXParser();
final RecorderProxy recorder = new RecorderProxy(parser.getXMLReader());
final ClipHolder clipHolder = new ClipHolder(recorder);
clipHolder.parse(new InputSource(new StringReader(srcXml)));
assertTrue(recorder.hasRecordingToReplay());
final Clip clip = clipHolder.getClip();
assertNotNull(clip);
assertEquals(clip.title, "My Title");
assertEquals(clip.category, "Blah!");
assertEquals(clip.date, Clip.DATE_FORMAT.parse("12/24/2012"));
clip.title = "My Title Updated";
clip.category = "Something else";
final ClipSerializer serializer = new ClipSerializer(recorder);
serializer.setClip(clip);
final TransformerFactory xsltFactory = TransformerFactory.newInstance();
final Transformer t = xsltFactory.newTransformer();
final StringWriter outXmlBuffer = new StringWriter();
t.transform(new SAXSource(serializer,
new InputSource()), new StreamResult(outXmlBuffer));
assertEquals(targetXml, outXmlBuffer.getBuffer().toString());
重要的几行是:
Clip
解析器 ( ClipHolder
) 环绕在记录器上ClipHolder
将只查看它知道的内容clip
object做任何你需要做的事self
注册为 ContentHandler
)并覆盖它所具有的内容说说 clip
对象。请找到DVR代码和Clip
测试 over at github
。希望对您有所帮助。
附注它不是一个通用的解决方案,整个记录->重播+覆盖概念在提供的实现中是非常基本的。基本上是一个插图。如果您的 XML 更复杂并且变得“多毛”(例如,不同级别上的相同元素名称等),则需要扩充逻辑。这个概念将保持不变。
关于java - 使用 SAX 进行解析时如何保留未绑定(bind)到对象的 XML 节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10648651/
我找到了 this excellent question and answer它以 x/y(加上 center x/y 和 degrees/radians)开始并计算旋转- 到 x'/y'。这个计算很
全部: 我已经创建了一个 Windows 窗体和一个按钮。在另一个线程中,我试图更改按钮的文本,但它崩溃了;但是如果我尝试更改按钮的颜色,它肯定会成功。我认为如果您更改任何 Windows 窗体控件属
本网站的另一个问题已证实,C 中没有缩写的字面后缀,并且可以执行以下操作: short Number = (short)1; 但是转换它和不这样做有什么区别: short Number = 1; 您使
我有下表: ID (int) EMAIL (varchar(50)) CAMPAIGNID (int) isSubscribe (bit) isActionByUser (bit) 此表存储了用户对事
也就是说,无需触发Javascript事件即可改变的属性,如何保留我手动选中或取消选中的复选框的状态,然后复制到另一个地方? 运行下面的代码片段并选中或取消选中其中的一些,然后点击“复制”: $('#
我在网上找到的所有关于递增指针导致段错误的示例都涉及指针的取消引用 - 如果我只想递增它(例如在 for 循环的末尾)并且我不在乎它是否最终进入无效内存,因为我不会再使用它。例如,在这个程序中,每次迭
我有一个 Spring MVC REST 服务,它使用 XStream 将消息与 XML 相互转换。 有什么方法可以将请求和响应中的 xml(即正文)打印到普通的 log4j 记录器? 在 Contr
做我的任务有一个很大的挑战,那就是做相互依赖的任务我在这张照片中说的。假设我们有两个任务 A 和 B,执行子任务 A1、A2 和 B1、B2,假设任务 B 依赖于 A。 要理想地执行任务 B,您应该执
通过阅读该网站上的几个答案,我了解到 CoInitialize(Ex) should be called by the creator of a thread 。然后,在该线程中运行的任何代码都可以使
这个问题已经困扰我一段时间了。我以前从未真正使用过 ListViews,也没有使用过 FirebaseListAdapters。我想做的就是通过显示 id 和用户位置来启动列表的基础,但由于某种原因,
我很难解释这两个(看似简单)句子的含义: “受检异常由编译器在编译时检查” 这是什么意思?编译器检查是否捕获了所有已检查的异常(在代码中抛出)? “未经检查的异常在运行时检查,而不是编译时” 这句话中
我有一个包含排除子字符串的文本文件,我想迭代该文件以检查并返回不带排除子字符串的输入项。 这里我使用 python 2.4,因此下面的代码可以实现此目的,因为 with open 和 any 不起作用
Spring 的缓存框架能否了解请求上下文的身份验证状态,或者更容易推出自己的缓存解决方案? 最佳答案 尽管我发现这个用例 super 奇怪,但您可以为几乎任何与 SpEL 配合使用的内容设置缓存条件
我有以下函数模板: template HeldAs* duplicate(MostDerived *original, HeldAs *held) { // error checking omi
如果我的应用程序具有设备管理员/设备所有者权限(未获得 root 权限),我如何才能从我的应用程序中终止(或阻止启动)另一个应用程序? 最佳答案 设备所有者可以阻止应用程序: DevicePolicy
非常简单的问题,但我似乎无法让它正常工作。 我有一个组件,其中有一些 XSLT(用于导航)。它通过 XSLT TBB 使用 XSLT Mediator 发布。 发布后
我正在将一个对象拖动到一个可拖放的对象内,该对象也是可拖动的。放置对象后,它会嵌套在可放置对象内。同样,如果我将对象拖到可放置的外部,它就不再嵌套。 但是,如果我经常拖入和拖出可放置对象,则可拖动对象
我正在尝试为按钮和弹出窗口等多个指令实现“取消选择”功能。也就是说,我希望当用户单击不属于指令模板一部分的元素时触发我的函数。目前,我正在使用以下 JQuery 代码: $('body').click
我从 this question 得到了下面的代码,该脚本用于在 Google tasks 上更改 iframe[src="about:blank"] 内的 CSS使用 Chrome 扩展 Tempe
我有一些 @Mock 对象,但没有指定在该对象上调用方法的返回值。该方法返回 int (不是 Integer)。我很惊讶地发现 Mockito 没有抛出 NPE 并返回 0。这是预期的行为吗? 例如:
我是一名优秀的程序员,十分优秀!