Ibn*_*eed 70 xml xml-attribute
我正在学习W3Schools的XML属性.
作者提到了以下内容(强调我的):
XML元素与属性
Run Code Online (Sandbox Code Playgroud)<person sex="female"> <firstname>Anna</firstname> <lastname>Smith</lastname> </person>
Run Code Online (Sandbox Code Playgroud)<person> <sex>female</sex> <firstname>Anna</firstname> <lastname>Smith</lastname> </person>在第一个例子中,性是一种属性.在最后,性是一个元素.两个示例都提供相同的信息.
关于何时使用属性以及何时使用元素没有规则.属性在HTML中很方便.在XML中,我的建议是避免它们.请改用元素.
避免使用XML属性?
使用属性的一些问题是:
- 属性不能包含多个值(元素可以)
- 属性不能包含树结构(元素可以)
- 属性不易扩展(用于将来的更改)
属性很难阅读和维护.使用元素数据.使用属性来获取与数据无关的信息.
那么作者的观点是一个着名的,或者这是XML中的最佳实践?
应该避免使用XML中的属性吗?
W3Schools还提到了以下内容(强调我的):
元数据的XML属性
有时ID引用分配给元素.这些ID可用于识别XML元素,其方式与HTML中的ID属性非常相似.此示例演示了这一点:
Run Code Online (Sandbox Code Playgroud)<messages> <note id="501"> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note> <note id="502"> <to>Jani</to> <from>Tove</from> <heading>Re: Reminder</heading> <body>I will not</body> </note> </messages>上面的ID只是一个标识符,用于标识不同的注释.它不是音符本身的一部分.
我在这里要说的是元数据(有关数据的数据)应该作为属性存储,并且数据本身应该存储为元素.
Pra*_*nth 56
属性或元素的使用通常由您尝试建模的数据决定.
例如,如果某个实体是PART数据,则最好是使一个元素.例如,员工的姓名是员工数据的重要组成部分.
现在,如果您想传达关于数据的METADATA(提供有关数据的附加信息的东西),但实际上并不是数据的一部分,那么最好将其作为属性.例如,假设每个员工都有一个后端处理所需的GUID,然后使其成为一个属性更好.(GUID不会向看到xml的人传达真正有用的信息,但可能是其他目的所必需的)
没有规则可以说某事应该是属性或元素.
它不需要不惜一切代价来避免属性.有时它们比元素更容易建模.这实际上取决于您尝试表示的数据.
Wil*_*eth 24
在OP之后的两年,我的0.02正好相反.让我解释.
考虑另一种方式:
例如,看一个简单的书籍和主要人物集合,标题将永远不会有"孩子",这是一个简单的元素.每个角色都有名字和年龄.
<book title='Hitchhiker's Guide to the Galaxy' author='Douglas Adams'>
<character name='Zaphod Beeblebrox' age='100'/>
<character name='Arthur Dent' age='42'/>
<character name='Ford Prefect' age='182'/>
</book>
<book title='On the Road' author='Jack Kerouac'>
<character name='Dean Moriarty' age='30'/>
<character name='Old Bull Lee' age='42'/>
<character name='Sal Paradise' age='42'/>
</book>
Run Code Online (Sandbox Code Playgroud)
你可以说一本书可能有多位作者.好的,只需通过添加新的作者元素进行扩展(可选择删除原始的@author).当然,你已经破坏了原有的结构,但在实践中它非常罕见,并且易于解决.假设单个作者的原始XML的任何消费者都必须进行更改(他们可能正在更改其数据库以将作者从"book"表中的列移动到"author"表).
<book title='Hitchhiker's Guide to the Galaxy'>
<author name='Douglas Adams'/>
<author name='Some Other Guy'/>
<character name='Zaphod Beeblebrox' age='100'/>
<character name='Arthur Dent' age='42'>
<character name='Ford Prefect' age='182'/>
</book>
Run Code Online (Sandbox Code Playgroud)
fly*_*ire 21
同样重要的是,将信息放入属性可以减少冗长的XML.
相比
<person name="John" age="23" sex="m"/>
Run Code Online (Sandbox Code Playgroud)
反对
<person>
<name>
John
</name>
<age>
<years>
23
</years>
</age>
<sex>
m
</sex>
</person>
Run Code Online (Sandbox Code Playgroud)
是的,这有点偏颇和夸张,但你明白了
Gaj*_*jus 10
我用谷歌搜索了确切的问题.首先,我登陆了这篇文章,http://www.ibm.com/developerworks/library/x-eleatt/index.html.虽然,对于这样一个简单的问题,感觉太长了.无论如何,我已经阅读了关于这个主题的所有答案,但没有找到令人满意的总结.因此,我回到后一篇文章.以下是摘要:
我何时使用元素?何时使用属性来显示信息?
核心内容原则
如果您认为有问题的信息是XML中表达或传达的基本材料的一部分,请将其放在元素中.如果您认为信息是主要通信的外围或附带信息,或者纯粹是为了帮助应用程序处理主要通信,请使用属性.
结构化信息原理
如果信息以结构化形式表示,特别是如果结构可以是可扩展的,则使用元素.如果信息表示为原子令牌,请使用属性.
可读性原则
如果信息旨在被人阅读和理解,请使用元素.如果信息最容易被机器理解和消化,请使用属性.
元素/属性绑定原理
如果您需要使用其他属性修改其值,请使用该元素.[..]让一个属性修改另一个属性几乎总是一个可怕的想法.
这是文章中重要部分的简短摘要.如果您希望查看每个案例的示例和完整描述,请参阅原始文章.
属性模型映射.元素上的一组属性直接同构化到名称/值映射中,其中值是文本或任何可序列化的值类型.例如,在C#中,任何Dictionary<string, string>对象都可以表示为XML属性列表,反之亦然.
这显然不是元素的情况.虽然您始终可以将名称/值映射转换为一组元素,但反之则不然,例如:
<map>
<key1>value</key1>
<key1>another value</key1>
<key2>a third value</key2>
</map>
Run Code Online (Sandbox Code Playgroud)
如果将其转换为地图,您将丢失两件事:与之关联的多个值key1以及key1之前出现的事实key2.
如果您查看用于以这种格式更新信息的DOM代码,这一点的重要性将变得更加清晰.例如,写这个是微不足道的:
foreach (string key in map.Keys)
{
mapElement.SetAttribute(key, map[key]);
}
Run Code Online (Sandbox Code Playgroud)
该代码简洁明了.与之形成鲜明对比,比方说:
foreach (string key in map.Keys)
{
keyElement = mapElement.SelectSingleNode(key);
if (keyElement == null)
{
keyElement = mapElement.OwnerDocument.CreateElement(key);
mapElement.AppendChild(keyElement);
}
keyElement.InnerText = value;
}
Run Code Online (Sandbox Code Playgroud)
您不能将 CDATA 放在属性中。根据我的经验,您迟早会想要将单引号、双引号和/或整个 XML 文档放入“成员”中,如果它是一个属性,您将诅咒使用属性的人的元素。
注意:我在 XML 方面的经验主要涉及清理其他人的。这些人似乎遵循了一句古老的格言“XML 就像暴力。如果使用它还没有解决您的问题,那么您还没有使用足够的东西”。