2008-11-18 76 views
1

考慮下面的XML「模板」:在XDocument中定位和設置元素值的最有效方法是什麼?

<Request module="CRM" call="list_service_features" id="{ID}"> 
    <block name="auth"> 
    <a name="username" format="text">{USERNAME}</a> 
    <a name="password" format="password">{PASSWORD}</a> 
    <a name="client-id" format="counting">{CLIENT-ID}</a> 
    </block> 
    <a name="service-id" format="counting">{SERVICE-ID}</a> 
</Request> 

使用的XDocument,什麼是在大括號設定值的最佳方式。到目前爲止,我仍然陷入了選擇<block/>元素內的三個<a />節點中的每一個的最佳方式。這只是XML的一小部分,其他可能有多達20個元素。

構建XML的方式不是我的創建,它是我們必須發送到供應商的'網絡服務'之前......在任何人對「format =」counting「屬性嘲笑之前:)

@David - 爲響應歡呼,讚賞。我有點希望它會是更優雅一點,還挺線沿線的:

List<XElement> e = doc.Descendants("a").ToList(); 
e.Where(x => x.Attributes("name") == "username").Single().Value = "abc"; 
e.Where(x => x.Attributes("name") == "password").Single().Value = "abc"; 

顯然上面的代碼不工作,但我以爲會有每個<a>標籤優雅的一個襯墊

回答

3

這是爲你做的嗎?好後代財產。

string xmlInput = ...; 
XDocument myDoc = XDocument.Parse(xmlInput); 
// 
List<XElement> someElements = myDoc.Descendants("a").ToList(); 
someElements.ForEach(x => x.Value = "Foo"); 
// 
Console.WriteLine(myDoc); 

嗯,我看你有一個屬性在那裏。也可以這樣做:

string xmlInput = //... 
XDocument myDoc = XDocument.Parse(xmlInput); 
// 
List<XText> someText = 
    myDoc.Descendants() 
    .Nodes() 
    .OfType<XText>() 
    .Where(x => x.Value.StartsWith("{") && x.Value.EndsWith("}")) 
    .ToList(); 
// 
List<XAttribute> someAttributes = 
    myDoc.Descendants() 
    .Attributes() 
    .Where(x => x.Value.StartsWith("{") && x.Value.EndsWith("}")) 
    .ToList(); 
// 
someText.ForEach(x => x.Value = "Foo"); 
someAttributes.ForEach(x => x.Value = "Bar"); 
// 
Console.WriteLine(myDoc); 

啊,現在你期待什麼,我會使其工作:

List<XElement> e = myDoc.Descendants("a").ToList(); 
e.Where(x => x.Attribute("name").Value == "username").Single().Value = "abc"; 
e.Where(x => x.Attribute("name").Value == "password").Single().Value = "abc"; 
+0

沒錯,這就是我要找的。我到了類似但更笨拙的地方:e.Attributes(「name」)。Where(a => a.Value ==「username」)。Single()。Parent.Value =「abcdef」;非常感激! – Kev 2008-11-18 20:22:56

相關問題