仅使用linq从Xelement替换值

时间:2011-03-10 10:07:48

标签: c# linq .net-3.5

编辑:更详细的HTML文档......简而言之,我如何实际进行查找以及element.setvalue或element.value应该在查询中出现的确切位置......

编辑2:猴子ID的列表看起来不清楚,所以我将添加正确的ID并向我的Lookup数据对象添加其他属性,抱歉让人感到困惑!我使用列表的原因是因为我的数据源可能来自任何地方我也使用过List对象,因为我真的不知道Dictionary的正确用法(我是编码的新手因此为什么我的问题到处都是,请忍受我)

我有一个XElement是一个格式正确的HTML文档,我试图用一个列表对象中包含的值替换html元素的值,例如

<div id="pageContainer">
<p> some guy wants to <b>buy</b> a <h4><label id="monkey23">monkeyfield</label></h4> for some price that I do not have a clue about, maybe we should <i>suggest</i> a list of other monkeys he may like:
</p>
<h3>list of special monekeys you may want chappy...</h3>
<br />
<ul>
    <li><label id="monkey13">monkeyfield</label></li>
    <li><label id="monkey3">monkeyfield</label></li>
    <li><label id="animal4">animalfield</label></li>
    <li><label id="seacreature5">seacreaturefield</label></li>
    <li><label id="mamal1">mamal field</label></li>
</ul>
</div>

注意:值“monkeyfield”是插入屏幕上的临时值,用于识别这是一个字段,一旦数据源中的值被绑定,新值就会出现。

public class LookupData
{
  public string id{get;set;}
  public string value{get;set;}
  public string Type{get;set;}
  public string Url{get;set;}
}

...    
public void DataTransformerMethod()
{
 var data = new List<LookupData>();
 data.add(new LookupData{id="monkey3", value="special monkey from africa" });
 data.add(new LookupData{id="monkey13", value="old monkey from china" });
 data.add(new LookupData{id="seacreature5", value="sea monkey" });
 data.add(new LookupData{id="animal4", value="rhino" });
 data.add(new LookupData{id="mamal1", value="some mamal creature" });
 //what linq query will iterate over the document and set the values from the values
 //found in the list?

       var answer = from x in HtmlDocAsAXelement
                    where x.Attributes()
                    .Any(a=> data.AsEnumerable().Where(f=> f.Name == a.Name) );
//somehow I should use .SetValue(a.value)???

SaveTheNewXElement(answer ); //all other original data must stay in tact...

}

2 个答案:

答案 0 :(得分:3)

好吧,你需要遍历所有需要更改的XElements - 并通过调用Value setter来设置它们的值:

element.Value =“newvalue”;

如果元素有多个文本节点并且您只想更改其中一个,那将会更棘手,但由于元素中没有其他内容,这对您来说应该没问题。

编辑:讨论结束后,我会做这样的事情:

Dictionary<string, string> replacements = data.ToDictionary(x => x.id,
                                                            x => x.value);

foreach (XElement element in HtmlDocAsAXelement.Descendants())
{
    string newValue;
    string id = (string) element.Attribute("id");
    if (id != null && replacements.TryGetValue(id, out newValue))
    {
        element.Value = newValue;
    }
}

答案 1 :(得分:0)

你不能“轻松”地做到这一点,因为在LINQ中没有foreach等价物。这是故意的。请参阅http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspxLINQ equivalent of foreach for IEnumerable<T>

我建议您对查询结果执行正常的foreach