如果我有一个XML文件,并且我想检查每个元素的属性id
的唯一性,如下面的文档:
<classes columns="id,name,short,classroomids,teacherid,grade,customfield1">
<class id="0ini" name="Initial Class" short="Init" teacherid="" classroomids="" grade="" customfield1="0"/>
<class id="*2" name="A1" short="A1" teacherid="" classroomids="" grade="" customfield1="30"/>
<class id="*3" name="A2" short="A2" teacherid="" classroomids="" grade="" customfield1=""/>
</classes>
我想检查id
属性唯一。
答案 0 :(得分:3)
假设您无法将其添加到架构中,您可以使用LINQ to XML:
var allIds = doc.Descendants()
.Select(x => x.Attribute("id"))
.Where(x => x != null)
.Select(x => x.Value)
.ToList();
var allDistinct = allIds.Count == allIds.Distinct().Count();
答案 1 :(得分:1)
在代码中还是什么?您始终可以添加XML Scheme或DTD并检查有效性(您可以将attr定义为唯一)。
即。编写XMLScheme或DTD(DTD更简单,但不太灵活),以定义XML的结构。在那里定义标记id
的属性class
是唯一的(在DTD中为ID
)。在代码中,检查给定的XML是否对XML Sheme / DTD有效
调整XML架构Unique
和DTD ID
:
XML XSD Schema - Enforce Unique Attribute Values in Schema
http://www.featureblend.com/dtd-unique-attribute.html
并在代码中搜索验证xml。
答案 2 :(得分:1)
您可以使用HashSet
检查唯一性。
var set = new HashSet<string>();
foreach(var id in doc.Descendants()
.Select(a => a.Attribute("id").Value))
if(!set.Add(id))
throw new Exception("Not Unique");
答案 3 :(得分:1)
var data = XElement.Parse (@"
<classes columns='id,name,short,classroomids,teacherid,grade,customfield1'>
<class id='0ini' name='Initial Class' short='Init' teacherid='' classroomids='' grade='' customfield1='0'/>
<class id='*2' name='A1' short='A1' teacherid='' classroomids='' grade='' customfield1='30'/>
<class id='*3' name='A2' short='A2' teacherid='' classroomids='' grade='' customfield1=''/>
</classes>");
bool containsDuplicates = data.Descendants().GroupBy(desc=>desc.Attribute("id").Value).Any(grp=>grp.Count()>1);
答案 4 :(得分:1)
此XPath返回一个布尔值,指示是否存在重复的@id
值:
boolean(//*/@id[.=following::*/@id])
XDocument d = XDocument.Parse(xml);
bool hasDuplicateId = (bool)d.XPathEvaluate("boolean(//*/@id[.=following::*/@id])");