linqtoxml-update
-
<menu1> <field1> <value1></value1> <value2></value2> </field1> <field2> <kp> <m> <mv>12345</mv> <mk>1</mk> </m> </kp> </field2> <field3> <kp> <m> <mv>54321</mv> <mk>1</mk> </m> </kp> </field3> <field4> <kp> <m> <mv>54321</mv> <mk>2</mk> </m> </kp> </field4> ... </menu1> <menu2> <field1> <value1></value1> <value2></value2> </field1> <field2> <kp> <m> <mv>12345</mv> <mk>1</mk> </m> </kp> </field2> <field3> <kp> <m> <mv>54321</mv> <mk>1</mk> </m> </kp> </field3> <field4> <kp> <m> <mv>54321</mv> <mk>1</mk> </m> </kp> </field4> ... </menu2> Hi, Using linq how is it possible to do the following please? Thanks in <menu1>, find <mv>54321</mv> <mk>2</mk> and replace it with the values of: <mk>1</mk> which is under <mv>12345</mv> therefore the result for <menu1> is: <menu1> <field1> <value1></value1> <value2></value2> </field1> <field2> <kp> <m> <mv>12345</mv> <mk>1</mk> </m> </kp> </field2> <field3> <kp> <m> <mv>54321</mv> <mk>1</mk> </m> </kp> </field3> <field4> <kp> <m> <mv>54321</mv> <mk>1</mk> </m> </kp> </field4> ... </menu1> <menu2> <field1> <value1></value1> <value2></value2> </field1> <field2> <kp> <m> <mv>12345</mv> <mk>1</mk> </m> </kp> </field2> <field3> <kp> <m> <mv>54321</mv> <mk>1</mk> </m> </kp> </field3> <field4> <kp> <m> <mv>54321</mv> <mk>1</mk> </m> </kp> </field4> ... </menu2>
-
<menu1> <field1> <value1></value1> <value2></value2> </field1> <field2> <kp> <m> <mv>12345</mv> <mk>1</mk> </m> </kp> </field2> <field3> <kp> <m> <mv>54321</mv> <mk>1</mk> </m> </kp> </field3> <field4> <kp> <m> <mv>54321</mv> <mk>2</mk> </m> </kp> </field4> ... </menu1> <menu2> <field1> <value1></value1> <value2></value2> </field1> <field2> <kp> <m> <mv>12345</mv> <mk>1</mk> </m> </kp> </field2> <field3> <kp> <m> <mv>54321</mv> <mk>1</mk> </m> </kp> </field3> <field4> <kp> <m> <mv>54321</mv> <mk>1</mk> </m> </kp> </field4> ... </menu2> Hi, Using linq how is it possible to do the following please? Thanks in <menu1>, find <mv>54321</mv> <mk>2</mk> and replace it with the values of: <mk>1</mk> which is under <mv>12345</mv> therefore the result for <menu1> is: <menu1> <field1> <value1></value1> <value2></value2> </field1> <field2> <kp> <m> <mv>12345</mv> <mk>1</mk> </m> </kp> </field2> <field3> <kp> <m> <mv>54321</mv> <mk>1</mk> </m> </kp> </field3> <field4> <kp> <m> <mv>54321</mv> <mk>1</mk> </m> </kp> </field4> ... </menu1> <menu2> <field1> <value1></value1> <value2></value2> </field1> <field2> <kp> <m> <mv>12345</mv> <mk>1</mk> </m> </kp> </field2> <field3> <kp> <m> <mv>54321</mv> <mk>1</mk> </m> </kp> </field3> <field4> <kp> <m> <mv>54321</mv> <mk>1</mk> </m> </kp> </field4> ... </menu2>
-
It may well help your case, to format your sample xml using proper indents and placing between <pre></pre> tags to make it more readable.
-
<menu1> <field1> <value1></value1> <value2></value2> </field1> <field2> <kp> <m> <mv>12345</mv> <mk>1</mk> </m> </kp> </field2> <field3> <kp> <m> <mv>54321</mv> <mk>1</mk> </m> </kp> </field3> <field4> <kp> <m> <mv>54321</mv> <mk>2</mk> </m> </kp> </field4> ... </menu1> <menu2> <field1> <value1></value1> <value2></value2> </field1> <field2> <kp> <m> <mv>12345</mv> <mk>1</mk> </m> </kp> </field2> <field3> <kp> <m> <mv>54321</mv> <mk>1</mk> </m> </kp> </field3> <field4> <kp> <m> <mv>54321</mv> <mk>1</mk> </m> </kp> </field4> ... </menu2> Hi, Using linq how is it possible to do the following please? Thanks in <menu1>, find <mv>54321</mv> <mk>2</mk> and replace it with the values of: <mk>1</mk> which is under <mv>12345</mv> therefore the result for <menu1> is: <menu1> <field1> <value1></value1> <value2></value2> </field1> <field2> <kp> <m> <mv>12345</mv> <mk>1</mk> </m> </kp> </field2> <field3> <kp> <m> <mv>54321</mv> <mk>1</mk> </m> </kp> </field3> <field4> <kp> <m> <mv>54321</mv> <mk>1</mk> </m> </kp> </field4> ... </menu1> <menu2> <field1> <value1></value1> <value2></value2> </field1> <field2> <kp> <m> <mv>12345</mv> <mk>1</mk> </m> </kp> </field2> <field3> <kp> <m> <mv>54321</mv> <mk>1</mk> </m> </kp> </field3> <field4> <kp> <m> <mv>54321</mv> <mk>1</mk> </m> </kp> </field4> ... </menu2>
I have some free time, so here you are:
var sourceQuery = from mNode in doc.Root.Descendants("m")
let mvNode = mNode.Element("mv")
let mkNode = mNode.Element("mk")
where (mvNode.Value == "54321") &&
(mkNode.Value == "2")
select mkNode;
var sourceNode = sourceQuery.First();var targetQuery = from mNode in doc.Root.Descendants("m")
let mvNode = mNode.Element("mv")
let mkNode = mNode.Element("mk")
where (mvNode.Value == "12345")
select mkNode;
var targetNode = targetQuery.First();sourceNode.ReplaceWith(targetNode);
I'm sure you will be able to fully understand the syntax and logic behind it. If not, go here and do some studying before asking the same question over and over. On an additional note, I used <pre> tags to make my code readable, as you can see.
-
I have some free time, so here you are:
var sourceQuery = from mNode in doc.Root.Descendants("m")
let mvNode = mNode.Element("mv")
let mkNode = mNode.Element("mk")
where (mvNode.Value == "54321") &&
(mkNode.Value == "2")
select mkNode;
var sourceNode = sourceQuery.First();var targetQuery = from mNode in doc.Root.Descendants("m")
let mvNode = mNode.Element("mv")
let mkNode = mNode.Element("mk")
where (mvNode.Value == "12345")
select mkNode;
var targetNode = targetQuery.First();sourceNode.ReplaceWith(targetNode);
I'm sure you will be able to fully understand the syntax and logic behind it. If not, go here and do some studying before asking the same question over and over. On an additional note, I used <pre> tags to make my code readable, as you can see.
Hi, I see what you are trying to do. thanks What i am puzzled about is that what if you are only interested to look at the data and not anything else i.e. you do not what to refer to data. How can the code be altered to cater for this? And I believe .Root should not be in the code? Thank you
-
Hi, I see what you are trying to do. thanks What i am puzzled about is that what if you are only interested to look at the data and not anything else i.e. you do not what to refer to data. How can the code be altered to cater for this? And I believe .Root should not be in the code? Thank you
-
I really don't understand what you mean. Can you try to explain better? As for Root, yes, maybe is not really needed.
Ok, let's say the xml is as follows and then look at the result ast the bottom. I am only interested to work in <Accounts> and not <positions> or anything else. The value 8 for mapKey of 123456 is replaced by 3 because 3 is the mapvalue of the 6543 mapKey Hope you see what I mean. Thank you XML --- <config> <column1> <value>something</value> </column1> ... <Accounts> <ownermap> <keymap> <Mapping> <mapKey>123456</mapKey> <mapValue>8</mapValue> </Mapping> <Mapping> <mapKey>6543</mapKey> <mapValue>3</mapValue> </Mapping> <Mapping> <Mapping> <mapKey>123456</mapKey> <mapValue>7</mapValue> </Mapping> <Mapping> ... </keymap> </ownermap> </Accounts> <positions> <ownermap> <keymap> <Mapping> <mapKey>123456</mapKey> <mapValue>8</mapValue> </Mapping> <Mapping> <mapKey>76566</mapKey> <mapValue>7</mapValue> </Mapping> <Mapping> ... </keymap> </ownermap> </positions> ... </config> ---- RESULT ---- <config> <column1> <value>something</value> </column1> ... <Accounts> <ownermap> <keymap> <Mapping> <mapKey>123456</mapKey> <mapValue>3</mapValue> </Mapping> <Mapping> <mapKey>6543</mapKey> <mapValue>3</mapValue> </Mapping> <Mapping> <Mapping> <mapKey>123456</mapKey> <mapValue>7</mapValue> </Mapping> <Mapping> ... </keymap> </ownermap> </Accounts> <positions> <ownermap> <keymap> <Mapping> <mapKey>123456</mapKey> <mapValue>8</mapValue> </Mapping> <Mapp
-
Ok, let's say the xml is as follows and then look at the result ast the bottom. I am only interested to work in <Accounts> and not <positions> or anything else. The value 8 for mapKey of 123456 is replaced by 3 because 3 is the mapvalue of the 6543 mapKey Hope you see what I mean. Thank you XML --- <config> <column1> <value>something</value> </column1> ... <Accounts> <ownermap> <keymap> <Mapping> <mapKey>123456</mapKey> <mapValue>8</mapValue> </Mapping> <Mapping> <mapKey>6543</mapKey> <mapValue>3</mapValue> </Mapping> <Mapping> <Mapping> <mapKey>123456</mapKey> <mapValue>7</mapValue> </Mapping> <Mapping> ... </keymap> </ownermap> </Accounts> <positions> <ownermap> <keymap> <Mapping> <mapKey>123456</mapKey> <mapValue>8</mapValue> </Mapping> <Mapping> <mapKey>76566</mapKey> <mapValue>7</mapValue> </Mapping> <Mapping> ... </keymap> </ownermap> </positions> ... </config> ---- RESULT ---- <config> <column1> <value>something</value> </column1> ... <Accounts> <ownermap> <keymap> <Mapping> <mapKey>123456</mapKey> <mapValue>3</mapValue> </Mapping> <Mapping> <mapKey>6543</mapKey> <mapValue>3</mapValue> </Mapping> <Mapping> <Mapping> <mapKey>123456</mapKey> <mapValue>7</mapValue> </Mapping> <Mapping> ... </keymap> </ownermap> </Accounts> <positions> <ownermap> <keymap> <Mapping> <mapKey>123456</mapKey> <mapValue>8</mapValue> </Mapping> <Mapp
So, you need to operate only on descendants of the Accounts node. Do you remember I used Root in my example? that was the search starting point. You can go on specifying subnodes at will, such as
doc.Root.Elements("Accounts")
Seriously, read the link I gave you and try to understand it before asking further questions. And use the code block when inserting XML, you have been already told to do so many times. -
So, you need to operate only on descendants of the Accounts node. Do you remember I used Root in my example? that was the search starting point. You can go on specifying subnodes at will, such as
doc.Root.Elements("Accounts")
Seriously, read the link I gave you and try to understand it before asking further questions. And use the code block when inserting XML, you have been already told to do so many times.Ok, There is no .Root under doc var doc = XElement.Load(FILE_PATH); var sourceQuery = from mNode in doc.Descendants("m") let mvNode = mNode.Element("mv") let mkNode = mNode.Element("mk") where (mvNode.Value == "54321") && (mkNode.Value == "2") select mkNode; Thanks
-
Ok, There is no .Root under doc var doc = XElement.Load(FILE_PATH); var sourceQuery = from mNode in doc.Descendants("m") let mvNode = mNode.Element("mv") let mkNode = mNode.Element("mk") where (mvNode.Value == "54321") && (mkNode.Value == "2") select mkNode; Thanks