LinQ - XML special path, condition

Noah Aas 140 Reputation points
2024-04-26T18:14:43.01+00:00

I need to change an element value that is dependent on the STEP value. MarkPosition or ControlPosition Can I pre-select better with XPathSelectElements? If so, how? <STEP value="MarkPosition"> <STEP value="ControlPosition">

<SIDE1>
  <POSITIONS>
	<POSITION>
	  <NUMBER value="1" />
	  <PROCESS>
		<STEP value="MarkPosition">
		  <PARAMETERSET1 value="NEW Value" />
		  <PARAMETERSET2 value="ParameterOK_1" />
		</STEP>
		<STEP value="ControlPosition">
		  <PARAMETERSET1 value="default_1" />
		  <PARAMETERSET2 value="" />
		</STEP>
	  </PROCESS>
	</POSITION>
	<POSITION>
	  <NUMBER value="2" />
var elements = xDocProgram.XPathSelectElements("//SIDE1/POSITIONS/POSITION/PROCESS"); //[@value]");
string name = "";
string text = "";
string value = "";

foreach (XElement element in elements)
{
	name = element.Name.LocalName;
	if (name == "PROCESS")
	{
		foreach (XElement elementProcess in element.Elements())
		{
			name = elementProcess.Name.LocalName;

			if (name == "STEP")
			{
				value = elementProcess.Attribute("value").Value;
				if (value == "MarkPosition")
				{
					foreach (XElement elementParameter in  elementProcess.Elements())
					{
						name = elementParameter.Name.LocalName;
						if ( name == "PARAMETERSET1" )
							elementParameter.Attribute("value").Value = "NEW Value";
					}
				}
			}
		}
	} 
}
xDocProgram.Save(currentProgramGoal);  // save with <?xml version="1.0" encoding="utf-8"?>

// Is it possible without this define? If I save again I should do it without XML definition. Can I deactivate this, if so where and how?

C#
C#
An object-oriented and type-safe programming language that has its roots in the C family of languages and includes support for component-oriented programming.
10,292 questions
{count} votes

Accepted answer
  1. Viorel 112.5K Reputation points
    2024-04-27T05:25:45.5233333+00:00

    Try this:

    XElement? elementParameter = xDocProgram.XPathSelectElement( "//SIDE1/POSITIONS/POSITION/PROCESS/STEP[@value='MarkPosition']/PARAMETERSET1" );
    
    if( elementParameter != null )
    {
        elementParameter.SetAttributeValue( "value", "NEW Value" );
    }
    
    using( var writer = XmlWriter.Create( currentProgramGoal, new XmlWriterSettings { OmitXmlDeclaration = true, Indent = true } ) )
    {
        xDocProgram.Save( writer );
    }
    

0 additional answers

Sort by: Most helpful