英文:
how to modify contents in a nested xml
问题
需要将CompValue
从"C02"修改为"C02,C03"。如何实现?我尝试了各种方法来修改XML内容,但迄今为止未找到解决方案。
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml("XML 值");
XmlNode root = xmlDoc.DocumentElement;
XmlNode myNode = root.SelectSingleNode("descendant::CompValue");
myNode.Value = "blabla";
还有
root.SelectSingleNode("//CritGroup/Crit").InnerText = "NewValue";
这是我的示例XML
<Search Name="Test1" ProjTypeID="107">
<SearchType SearchTypeID="20246" />
<FiscalYear Year="2022" />
<CorpEnt CEID="367" CEName="Sample" />
<CritGroup CritGroupID="1" CritGroupAndOr="AND">
<Crit CritID="205" RelID="275" CompValue="C02" CompValueHuman="C02" AndOr="AND" TextBoxName="tbProjNum" />
<Crit CritID="208" RelID="280" CompValue="11" CompValueHuman="Yes" AndOr="AND" TextBoxName="" />
</CritGroup>
<PageSize Size="200" />
</Search>
英文:
I need to modify the CompValue
from "C02" to "C02,C03" . How to achieve this ?I have tried various ways to modify the XML content but so far could not find a solution.
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml("XML value");
XmlNode root = xmlDoc.DocumentElement;
XmlNode myNode = root.SelectSingleNode("descendant::CompValue");
myNode.Value = "blabla";
Also
root.SelectSingleNode("//CritGroup/Crit").InnerText = "NewValue";
This is my sample xml
<Search Name="Test1" ProjTypeID="107">
<SearchType SearchTypeID="20246" />
<FiscalYear Year="2022" />
<CorpEnt CEID="367" CEName="Sample" />
<CritGroup CritGroupID="1" CritGroupAndOr="AND">
<Crit CritID="205" RelID="275" CompValue="C02" CompValueHuman="C02" AndOr="AND" TextBoxName="tbProjNum" />
<Crit CritID="208" RelID="280" CompValue="11" CompValueHuman="Yes" AndOr="AND" TextBoxName="" />
</CritGroup>
<PageSize Size="200" />
</Search>
答案1
得分: 2
请尝试以下解决方案。
它使用自2007年以来在.NET Framework中可用的LINQ to XML API。
c#
void Main()
{
XDocument xdoc = XDocument.Parse(@"<Search Name='Test1' ProjTypeID='107'>
<SearchType SearchTypeID='20246'/>
<FiscalYear Year='2022'/>
<CorpEnt CEID='367' CEName='Sample'/>
<CritGroup CritGroupID='1' CritGroupAndOr='AND'>
<Crit CritID='205' RelID='275' CompValue='C02' CompValueHuman='C02'
AndOr='AND' TextBoxName='tbProjNum'/>
<Crit CritID='208' RelID='280' CompValue='11' CompValueHuman='Yes'
AndOr='AND' TextBoxName=''/>
</CritGroup>
<PageSize Size='200'/>
</Search>");
var Crits = xdoc.Descendants("Crit")
.Where(x => x.Attribute("CompValue").Value == "C02");
foreach (XElement Crit in Crits)
{
Crit.Attribute("CompValue").SetValue("C02,C03");
}
}
Output XML
<Search Name="Test1" ProjTypeID="107">
<SearchType SearchTypeID="20246" />
<FiscalYear Year="2022" />
<CorpEnt CEID="367" CEName="Sample" />
<CritGroup CritGroupID="1" CritGroupAndOr="AND">
<Crit CritID="205" RelID="275" CompValue="C02,C03" CompValueHuman="C02" AndOr="AND" TextBoxName="tbProjNum" />
<Crit CritID="208" RelID="280" CompValue="11" CompValueHuman="Yes" AndOr="AND" TextBoxName="" />
</CritGroup>
<PageSize Size="200" />
</Search>
希望这能帮助你。
英文:
Please try the following solution.
It is using LINQ to XML API that is available in the .Net Framework since 2007.
c#
void Main()
{
XDocument xdoc = XDocument.Parse(@"<Search Name='Test1' ProjTypeID='107'>
<SearchType SearchTypeID='20246'/>
<FiscalYear Year='2022'/>
<CorpEnt CEID='367' CEName='Sample'/>
<CritGroup CritGroupID='1' CritGroupAndOr='AND'>
<Crit CritID='205' RelID='275' CompValue='C02' CompValueHuman='C02'
AndOr='AND' TextBoxName='tbProjNum'/>
<Crit CritID='208' RelID='280' CompValue='11' CompValueHuman='Yes'
AndOr='AND' TextBoxName=''/>
</CritGroup>
<PageSize Size='200'/>
</Search>");
var Crits = xdoc.Descendants("Crit")
.Where(x => x.Attribute("CompValue").Value == "C02");
foreach (XElement Crit in Crits)
{
Crit.Attribute("CompValue").SetValue("C02,C03");
}
}
Output XML
<Search Name="Test1" ProjTypeID="107">
<SearchType SearchTypeID="20246" />
<FiscalYear Year="2022" />
<CorpEnt CEID="367" CEName="Sample" />
<CritGroup CritGroupID="1" CritGroupAndOr="AND">
<Crit CritID="205" RelID="275" CompValue="C02,C03" CompValueHuman="C02" AndOr="AND" TextBoxName="tbProjNum" />
<Crit CritID="208" RelID="280" CompValue="11" CompValueHuman="Yes" AndOr="AND" TextBoxName="" />
</CritGroup>
<PageSize Size="200" />
</Search>
答案2
得分: 1
你需要获取完整的节点并替换属性。以下是示例代码:
var xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xml);
var critNode = xmlDoc.SelectSingleNode("//Crit[@CompValue='C02']");
if (critNode != null)
{
var compValueAttr = critNode.Attributes["CompValue"];
if (compValueAttr != null)
{
compValueAttr.Value = "C02,C03";
}
}
var modifiedXml = xmlDoc.OuterXml;
Console.WriteLine(modifiedXml);
英文:
You need to get the complete node and replace the attribute. Here is the example
var xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xml);
var critNode = xmlDoc.SelectSingleNode("//Crit[@CompValue='C02']");
if (critNode != null)
{
var compValueAttr = critNode.Attributes["CompValue"];
if (compValueAttr != null)
{
compValueAttr.Value = "C02,C03";
}
}
var modifiedXml = xmlDoc.OuterXml;
Console.WriteLine(modifiedXml);
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论