Как проверить уникальность атрибута в файле XML - PullRequest
2 голосов
/ 08 января 2012

Если у меня есть файл 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 ]

3 голосов
/ 08 января 2012

Предполагая, что вы не можете добавить его в схему, вы можете использовать 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 голос
/ 08 января 2012

Этот XPath возвращает логическое значение, указывающее, повторяются ли или нет @id значения:

boolean(//*/@id[.=following::*/@id])

Применяется с помощью метода XPathEvaluate :

XDocument d = XDocument.Parse(xml);
bool hasDuplicateId = (bool)d.XPathEvaluate("boolean(//*/@id[.=following::*/@id])");
1 голос
/ 08 января 2012
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);
1 голос
/ 08 января 2012

Вы можете использовать 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");
1 голос
/ 08 января 2012

в коде или как?Вы всегда можете добавить XML-схему или DTD и проверить достоверность (вы можете определить attr как уникальный).

т.е. напишите XMLScheme или DTD (DTD проще, но менее гибок), чтобы определить структуру вашего XML.Определите там, что атрибут id тега class является уникальным (ID в DTD).В коде проверьте, является ли данный XML допустимым для XML Sheme / DTD

Tuts для XML-схем Unique и DTD ID:

XML XSD-схема - применение уникальных значений атрибутовв схеме

http://www.featureblend.com/dtd-unique-attribute.html

и найдите для проверки xml в коде.

...