Xdocument修改匹配的所有属性

时间:2012-07-25 11:24:43

标签: c# linq linq-to-xml

这让我很生气,我已经尝试了2天了。

我基本上想要根据名称替换值。

我有xml如下:

    <session>   
      <immediate>   
        <diff name="TEST_DIFF">
          <pivot name="(Original)">
            <grid-processor name="mdStoredShape"/>
            <axes>
              <axis position="SLICERS">
                <attribute name="Result Namespace" mode="INCLUSIVE">
                  <selection value="$NAMESPACE$"/>
                </attribute>
                <attribute name="Date" mode="INCLUSIVE">
                  <selection value="$DATEFROM$"/>
                </attribute>
                <attribute name="Book" mode="INCLUSIVE">
                  <selection value="$BOOK_NAME$" type="Book Hierarchy"/>
                </attribute>
                <attribute name="Measure" mode="INCLUSIVE">
                  <exclude value="PV"/>
                </attribute>
                <attribute name="Risk Source System" mode="INCLUSIVE">
                  <selection value="gdsldn"/>
                </attribute>
                <attribute name="Is Error">
                  <selection value="false"/>
                </attribute>
              </axis>
              <axis position="DISCRIMINATOR">
                <attribute name="Book" mode="ALL"/>
                <attribute name="Book" mode="ALL"/>
                <attribute name="Measure" mode="ALL"/>
              </axis>
              <axis position="RESULT">
                <attribute name="SUM(Money Value In(GBP))"/>
                <attribute name="COUNT_DISTINCT(Book)"/>
              </axis>
            </axes>
          </pivot>
          <pivot name="(New)">
            <grid-processor name="mdStoredShape"/>
            <axes>
              <axis position="SLICERS">
                <attribute name="Result Namespace" mode="INCLUSIVE">
                  <selection ref="$NAMESPACE$"/>
                </attribute>
                <attribute name="Date" mode="INCLUSIVE">
                  <selection ref="$DATETO$"/>
                </attribute>
                <attribute name="Book" mode="INCLUSIVE">
                  <selection value="$BOOK_NAME$" type="Book Hierarchy"/>
                </attribute>
                <attribute name="Measure" mode="INCLUSIVE">
                  <exclude ref="PV"/>
                </attribute>
                <attribute name="Risk Source System" mode="INCLUSIVE">
                  <selection value="gdsldn"/>
                </attribute>
                <attribute name="Is Error">
                  <selection value="false"/>
                </attribute>
              </axis>
              <axis position="DISCRIMINATOR">
                <attribute name="Book" mode="ALL"/>
                <attribute name="Book" mode="ALL"/>
                <attribute name="Measure" mode="ALL"/>
              </axis>
              <axis position="RESULT">
                <attribute name="SUM(Money Value In(GBP))"/>
                <attribute name="COUNT_DISTINCT(Book)"/>
              </axis>
            </axes>
            <source name="risk"/>
          </pivot>
        </diff>   
    </immediate> 
</session>

我希望用实际值替换所有$ NAMESPACE $值。

有人可以帮忙吗?

了解我正在使用的其他信息

XElement xeNS = Xdoc.Descendants("selection").First(el => (String)el.Attribute("value").Value == "$NAMESPACE$");
            xeNS.SetAttributeValue("value", ns);

但这只取代了第一个实例。我希望linq查询然后循环并应用更改?

2 个答案:

答案 0 :(得分:1)

如果这就是全部,为什么不使用“xml”.replace(“oldavalue”,“newvalue”)?

答案 1 :(得分:0)

我设法最终解决了这个问题 - 选择正确的属性然后循环遍历元素..

  

var query =来自x中的Xdoc.Descendants(“selection”)                            其中x.Attribute(“value”)。Value ==“$ BOOK_NAME $”                            选择x;

        foreach (XElement xe in query)
        {
            xe.Attribute("value").Value = book;                
        }