带有临时元素名称的 XML(用于配置文件)?

Posted

技术标签:

【中文标题】带有临时元素名称的 XML(用于配置文件)?【英文标题】:Xml with ad-hoc element names (for configuration files)? 【发布时间】:2017-03-03 01:40:35 【问题描述】:

我知道在 XML 文件中存储一些配置信息的“经典”方法基本上是这样的:

<properties>
  <entry key="hello">Hello</entry>
  <entry key="world">world</entry>
</properties>

或者这个:

<properties>
  <entry key="hello" value="Hello"/>
  <entry key="world" value="World"/>
</properties>

我们目前正在尝试提供一个简单而灵活的配置文件供内部使用,该文件将被多种脚本语言以及可能的某些 C# 和 C++ 读取。

我想知道上述方法是否是“可行的方法”,或者带有“临时”元素的方法是否会产生一个更容易从中提取信息的文件:

<properties>
  <hello>Hello</hello>
  <world>World</hello>
</properties>

当然,任何 XPath 表达式都会变短,例如:

"//properties/hello" 
vs.
"//properties/entry[@key='hello']/@value

我认为这将使快速从文件中获取一些信息的脚本更易于阅读。

这些表格有什么优点/缺点。轻松简洁地从中获取价值? (与可维护性相比,...)

我并不太关心这个架构,不要进入XML for configuration files, why?。

【问题讨论】:

【参考方案1】:

可能两个结构之间考虑的主要区别是您可以重复元素但不能重复属性,而且正如您所提到的,仅解析元素比解析元素和属性更容易。只有当属性对整个节点是唯一的时,它们才更有意义,例如我们想要存储客户端及其地址:

最佳方法:

<client id="123">
   <address>address123</address>
   <address>address456</address>
</client>

不太好,因为潜在的不一致,尤其是在没有架构验证的情况下:

<client>
   <id>123</id>
   <address>address123</address>
   <address>address456</address>
</client>

最糟糕的方法,难以从中提取信息:

<client id="123" address1="address123" address2="address456">

对于属性文件,您可能对层次结构更感兴趣,在我看来,主要基于元素的结构应该会做得很好。

【讨论】:

【参考方案2】:

有关元素与属性的一般建议,请参阅 XML elements vs XML attributes。此答案将重点关注特定与通用 XML 元素名称。

特定与通用 XML 元素名称

以下是在 XML 中选择特定元素名称和通用元素名称的一些准则:

特定元素名称

 <FirstName>John</FirstName>

在...时使用特定的元素名称

您的域有一个相对固定的词汇表。 您更喜欢稳定性而不是开放式灵活性。 存在具有特定名称的行业标准词汇或架构。 您希望能够在任何 XML 架构中编写干净的内容模型。 您希望 XPath 更干净。

通用元素名称

 <entry key="FirstName">John</entry>

在...时使用通用元素名称

特定元素名称的原因均不适用。 词汇术语在词汇上与 XML 的词汇规则不兼容。 (如果可能有嵌入空格,请以数字等开头)

通常,您应该使用特定的元素名称。通用键值存储(通常非常适合配置文件)是此一般准则的一个例外。

【讨论】:

以上是关于带有临时元素名称的 XML(用于配置文件)?的主要内容,如果未能解决你的问题,请参考以下文章

struts.xml 配置文件的主要元素

史上最全web.xml配置文件元素详解

web.xml配置文件

用于写出为序列化程序创建的临时程序集的Xml配置项

spring的xml配置文件的xml文件头详解

java文件中怎样获取webcontent/web-inf/conf目录下的xml配置文