xml提交数据库方法_XML的新方法–第2部分:XMLBeam库的功能

xml提交数据库方法

本文是系列文章的一部分。 在阅读本文之前,我们建议您阅读“ 第1部分:使用XMLBeam 进行 数据投影 ”,以使您快速 入门

这次,我们仔细看一下XMLBeam库的功能。 我们将向您展示如何对投影目标进行参数设置 ,解释外部文档的使用以及如何开始编写投影。

在本系列的第一部分中,我们了解了数据投影的概念和子投影的功能。 通过将XPath表达式添加到方法声明中,XMLBeam是一种了不起的多功能工具。 今天,我们通过增强带有参数的投影方法,来使用具有更多功能的Java库。 即使在运行时,这些参数也会影响投影方法的目标。 让我们从一个现实世界的例子开始:

Example 1: Eclipse Code Formatter Configuration (Extract)
<profiles>
<profile name="Some Profile" version="8">
<setting id="org.eclipse.jdt.core.formatter..." value="false" />
                ...
</profile>
<profile name="Another Profile" version="8">
<setting id="org.eclipse.jdt.core.formatter..." value="true" />
         ...
</profile>
</profiles>

此XML文件包含多个配置配置文件。 我们定义了一个投影界面,以获取所有配置文件名称和一个所选配置文件的所有设置的列表。

Example 1: Projection interface
@XBDocURL("resource://eclipsecodeformatprofile.xml")
public interface EclipseFormatterConfigFile {
interface Setting {
@XBRead("@id")
String getName();
@XBRead("@value")
String getValue();
}
@XBRead("//profile/@name")
List<String> getProfileNames();
@XBRead("//profile[@name="{0}"]/setting")
List<Setting> getAllSettingsForProfile(String profileName);
}

现在,我们将包含 @XBDocURL 的第一行 放在一边,因为我们稍后会再讲到这一点。

内部接口 Setting 作为子投影,为每个配置条目返回相应的值。 方法getProfileNames()满足了提供配置文件名称列表的第一个要求。

相应的XPath表达式选择所有属性 的所有元素 “ 轮廓 “ 的 “ 名称 ”。 像本系列第一部分的示例一样,我们并不关心XML结构。 简单的XPath表达式即可完成其工作。 内部接口 Setting 是我们的子投影,用于访问配置文件设置的所有值。

第二种方法“ getAllSettingsForProfile( String )”定义一个 String 参数,该参数在被调用时填充XPath表达式中的占位符“ {0}”。

这是可行的,因为投影方法的所有参数都通过类 java.text.MessageFormat 应用于其XPath表达式。 因此,有效目标的规范可能具有多个参数。 为了将这一概念与静态数据投影区分开,我们将其称为动态投影。

在[2]中描述了 MessageFormat 类的广泛语法 。 我们的第一个示例仅使用一个 String :

Example 1: Source code
EclipseFormatterConfigFile configFile = new XBProjector().io().fromURLAnnotation(EclipseFormatterConfigFile.class);

System.out.println("Profile names:" + configFile.getProfileNames());

for (Setting setting:configFile.getAllSettingsForProfile("Some Profile")) {
    System.out.println(setting.getName()+" -> "+setting.getValue());
}

定义了投影界面后,只需四行代码即可打印出配置文件列表和一个配置文件的所有设置。

现在,我们回到注释 @XBDocURL 的首次使用 。 它将目标文档的URL分配给投影,因此可以从声明的原点加载文档。 调用方法projection.io()。fromURLAnnotation(...)时会发生这种情况。

除了类 java.net.URL 支持的标准协议之外 ,投影机还接受特殊的标识符“资源”,以定义类路径中的位置。 当前投影接口的类加载器用于加载文档。 因此,您只需要将文档放置在投影界面旁边即可让投影机找到它。 成功加载和解析文档后,URL被设置为DOM-Tree中的BaseURI。 当然,无需在接口中声明URL。 调用 projection.io()。url(“ resource://eclipsecodeformatprofile.xml”).read(…)也可以。

注释 @XBDocURL 还有第二个用例 。 您可以直接在投影方法上使用它,这样XPath评估的目标文档不再是附加到投影接口的文档,而是外部文档。 这样,可以 在一个Java对象中访问多个文档。 一个简单的例子:

Example 2: Projection interface with external documents
public interface ExternalDocumentsDemo {
@XBDocURL("http://somewhere.examle/fooDocument.xml")
@XBRead("//foo")
String getFoo();

@XBDocURL("http://somewhere.examle/barDocument.xml")
@XBRead("//bar")
String getBar();
}

接口 ExternalDocumentsDemo 为两个不同的外部文档定义了两种投影方法。 调用这种方法时,分配的XPath表达式不再应用于投影方法的文档。 甚至可以将用于投影的文档留空。

Example 2: Using external documents
ExternalDocumentsDemo projection = new XBProjector().projectEmptyDocument(ExternalDocumentsDemo.class);
System.out.println("Content of foo:"+projection.getFoo());
System.out.println("Content of bar:"+projection.getBar());

每个方法调用都会导致加载目标文档,评估XPath表达式并返回转换为所需Java类型的结果。 这甚至可以与动态投影结合使用,因为参数也在文档URL中填充占位符。

Example 3: A generic XPath evaluator on external documents
public interface DynamicExternalDemo {
@XBDocURL("{0}")
@XBRead("{1}")
String evaluateXPathfromURL(String url, String xpath);
}

示例3演示了XMLBeam数据投影的表达能力。 使用XMLBeam创建一个通用工具来从给定URL的文档中提取数据非常简单。

在我们对外部或动态投影头过于分散注意力之前,我们先看一下另一个主题:双向投影。

在本系列的第一部分中,我们已经了解到投影是DOM树的视图。 现在我们了解到这些视图不仅限于读取元素或属性。 支持创建,读取,更新和删除任何DOM节点。 但是,必须限制所有写操作的XPath语法。 例如,不得使用函数,并且XPath选择器的目标必须不同。 当表达式符合这些形式时,读取和写入就是对称操作。 这意味着您读取的是 先前写入 的相同数据 ,并且写入之前读取的数据不会更改文档。

Example 4: A bidirectional projection
public interface Bidirectional {
@XBRead("/a/b/c/foo")
String getFoo();

@XBWrite("/a/b/c/foo")
void setFoo(String value)

@XBDelete("/a/b/c/foo")
void deleteFoo();
}

声明书写投影方法类似于声明阅读投影方法:代替 @XBRead, 必须使用 注释 @XBWrite ,并且该方法需要一个参数来写入要写入的值。 使用toString()方法时,可以自由选择参数类型。 传递 null 值会从投影目标中删除该值,分别留下一个空的属性或元素。 要删除整个属性或元素,请使用注释 @XBDelete 。

至此,我们已经看到了带有XPath表达式参数的动态投影,以及带有值参数的投影。 但是,如何将编写投影与动态XPath目标结合起来呢? 在下一个示例中显示。

Example 5: A dynamic bidirectional projection
public interface DynamicBidirectional {
@XBWrite("/a/{1}/foo")
void setFoo(String value,String parentElementName)

@XBWrite("/a/b/foo[@key="{0}"]/@value")
void setValue(String key,@Value int value);
}

setFoo()方法获取XPath表达式中使用的另一个参数。 第一个将作为值写入元素“ foo”。 对于第二种方法“ setValue(…)”,我们决定以其他方式创建我们的API。 通过仅用@Value注释此参数,我们将第二个参数更改为value参数。 当我们在本系列的第四部分中解释完整文档的创建时,我们将回到写预测。

在本系列的第三部分中,我们将使用名称空间来说明XMLBeam的用法,展示投影仪的配置能力,并解释如何将XPath表达式与Java代码分开存储。

关于作者

Sven Ewald(Twitter句柄:@Cfx)是库XMLBeam(@XMLBeam)的作者。 他从事Java解决方案已有15年的历史了,而且还没有结束。 目前,他在汽车行业的领域特定语言领域工作


Links & Literature

[1] http://xmlbeam.org

[2] http://docs.oracle.com/javase/7/docs/api/java/text/MessageFormat.html

[3] http://www.w3schools.com/dom/prop_attr_baseuri.asp


翻译自: https://jaxenter.com/a-new-approach-to-xml-part-2-features-of-the-xmlbeam-library-107614.html

xml提交数据库方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值