2012-01-08 57 views
2

如果我有一個XML文件,我想檢查類似下面的文檔的每個元素的屬性id獨特如何檢查屬性的獨特性在一個XML文件

<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屬性是唯一

回答

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"); 
1

在代碼中還是什麼?您可以隨時添加XML Scheme或DTD並檢查有效性(您可以將attr定義爲唯一的)。

即編寫XMLScheme或DTD(DTD更簡單但靈活性更低)來定義XML的結構。在那裏定義標籤class的屬性id是唯一的(在DTD中是ID)。在代碼中,檢查是否給定的XML的XML模式Unique和DTD ID是對XML Sheme/DTD

TUTS有效:

XML XSD Schema - Enforce Unique Attribute Values in Schema

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

並搜索代碼驗證XML。

+0

耶在代碼.. – 2012-01-08 12:09:41

+0

難道你能給我一個例子或者鏈接到你想說的嗎? – 2012-01-08 12:10:28

+0

請參閱編輯。順便說一下,'classes'中的'colums'對我來說似乎過分和錯誤。定義標籤具有的屬性是文檔結構,而不是數據 - 它應該在schema/dtd中,而不是在父元素中。 – 2012-01-08 12:30:45

3

假設你不能將它添加到模式中,你可以使用LINQ到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(); 
+0

嗯,非常感謝。對於一個元素或所有元素: 這樣的xml文件: – 2012-01-08 12:13:50

+1

@just_name:這是整個文檔 - 這就是後代所稱的。 – 2012-01-08 13:20:55

+0

非常感謝... – 2012-01-08 13:46:36

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); 
1

該XPath返回表示是否存在重複@id值的布爾值:

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

施加有XPathEvaluate method

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