如何检查XML文件中属性的唯一性

时间:2012-01-08 12:04:51

标签: asp.net xml linq unique xmlreader

如果我有一个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属性唯一

5 个答案:

答案 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])

应用XPathEvaluate method

XDocument d = XDocument.Parse(xml);
bool hasDuplicateId = (bool)d.XPathEvaluate("boolean(//*/@id[.=following::*/@id])");