通过Linq C#通过Xdocument更新XML
我正在使用C#中的Xdocument来操纵以下XML文档的更精细版本。我正在尝试检查每个部分的“零件”元素值是否为99999。如果值为99999,我想将整个零件元素交换为我存储在字符串变量中的新零件元素。
<statement>
<header>
<created>5/3/2022</created>
<charges>100.00</charges>
<description>some text</description>
<billing-party>
<name>3304</name>
<address>1703</address>
<phone />
</billing-party>
</header>
<invoices>
<invoice>
<invoice-no>39D5</invoice-no>
<line-items>
<line-item>
<line-no>1</line-no>
<parts>
<part>
<part-no>990303</part-no>
<description>
some description
</description>
<tax />
<value>270.50</value>
<quantity />
</part>
<part>
<part-no>890304</part-no>
<description>
some description
</description>
<tax />
<value>270.50</value>
<quantity />
</part>
</parts>
<part-number>139186</part-number>
</line-item>
<line-item>
<line-no>2</line-no>
<parts>
<part>
<part-no>990303</part-no>
<description>
some description
</description>
<tax />
<value>270.50</value>
<quantity />
</part>
<part>
<part-no>890304</part-no>
<description>
some description
</description>
<tax />
<value>270.50</value>
<quantity />
</part>
</parts>
<part-number>139186</part-number>
</line-item>
<line-item>
<line-no>1</line-no>
<parts>
<part>
<part-no>990303</part-no>
<description>
some description
</description>
<tax />
<value>270.50</value>
<quantity />
</part>
<part>
<part-no>890304</part-no>
<description>
some description
</description>
<tax />
<value>270.50</value>
<quantity />
</part>
</parts>
<part-number>139186</part-number>
</line-item>
</line-items>
</invoice>
<invoice>
<invoice-no>39D5</invoice-no>
<line-items>
<line-item>
<line-no>1</line-no>
<parts>
<part>
<part-no>990303</part-no>
<description>
some description
</description>
<tax />
<value>270.50</value>
<quantity />
</part>
<part>
<part-no>890304</part-no>
<description>
some description
</description>
<tax />
<value>270.50</value>
<quantity />
</part>
</parts>
<part-number>139186</part-number>
</line-item>
<line-item>
<line-no>2</line-no>
<parts>
<part>
<part-no>990303</part-no>
<description>
some description
</description>
<tax />
<value>270.50</value>
<quantity />
</part>
<part>
<part-no>890304</part-no>
<description>
some description
</description>
<tax />
<value>270.50</value>
<quantity />
</part>
</parts>
<part-number>139186</part-number>
</line-item>
<line-item>
<line-no>1</line-no>
<parts>
<part>
<part-no>99999</part-no>
<description>
some description
</description>
<tax />
<value>270.50</value>
<quantity />
</part>
<part>
<part-no>890304</part-no>
<description>
some description
</description>
<tax />
<value>270.50</value>
<quantity />
</part>
</parts>
<part-number>139186</part-number>
</line-item>
</line-items>
</invoice>
</invoices>
</statement>
使用LINQ,在不创建新的Xdocument的情况下执行此操作的最佳方法是什么?
我尝试了这一点,但是我是Linq的新手,并且不太了解如何在不使用FirstOrdOdefault()的情况下实现这一目标。
statementFile.ReplaceNodes(
from invoice in statementFile.Descendants("invoices")
from lineItem in invoice.Descendants("line-items")
from part in lineItem.Descendants("parts")
where part.Element("part-no").Value.Equals("99999")
select part.ReplaceWith(updatedPart));
);
I'm using XDocument in C# to manipulate a more elaborate version of the below XML document. I'm trying to check if the 'part-no' element value is 99999 for each part. If the value is 99999, I want to swap out the entire part element for a new part element I have stored in string variable.
<statement>
<header>
<created>5/3/2022</created>
<charges>100.00</charges>
<description>some text</description>
<billing-party>
<name>3304</name>
<address>1703</address>
<phone />
</billing-party>
</header>
<invoices>
<invoice>
<invoice-no>39D5</invoice-no>
<line-items>
<line-item>
<line-no>1</line-no>
<parts>
<part>
<part-no>990303</part-no>
<description>
some description
</description>
<tax />
<value>270.50</value>
<quantity />
</part>
<part>
<part-no>890304</part-no>
<description>
some description
</description>
<tax />
<value>270.50</value>
<quantity />
</part>
</parts>
<part-number>139186</part-number>
</line-item>
<line-item>
<line-no>2</line-no>
<parts>
<part>
<part-no>990303</part-no>
<description>
some description
</description>
<tax />
<value>270.50</value>
<quantity />
</part>
<part>
<part-no>890304</part-no>
<description>
some description
</description>
<tax />
<value>270.50</value>
<quantity />
</part>
</parts>
<part-number>139186</part-number>
</line-item>
<line-item>
<line-no>1</line-no>
<parts>
<part>
<part-no>990303</part-no>
<description>
some description
</description>
<tax />
<value>270.50</value>
<quantity />
</part>
<part>
<part-no>890304</part-no>
<description>
some description
</description>
<tax />
<value>270.50</value>
<quantity />
</part>
</parts>
<part-number>139186</part-number>
</line-item>
</line-items>
</invoice>
<invoice>
<invoice-no>39D5</invoice-no>
<line-items>
<line-item>
<line-no>1</line-no>
<parts>
<part>
<part-no>990303</part-no>
<description>
some description
</description>
<tax />
<value>270.50</value>
<quantity />
</part>
<part>
<part-no>890304</part-no>
<description>
some description
</description>
<tax />
<value>270.50</value>
<quantity />
</part>
</parts>
<part-number>139186</part-number>
</line-item>
<line-item>
<line-no>2</line-no>
<parts>
<part>
<part-no>990303</part-no>
<description>
some description
</description>
<tax />
<value>270.50</value>
<quantity />
</part>
<part>
<part-no>890304</part-no>
<description>
some description
</description>
<tax />
<value>270.50</value>
<quantity />
</part>
</parts>
<part-number>139186</part-number>
</line-item>
<line-item>
<line-no>1</line-no>
<parts>
<part>
<part-no>99999</part-no>
<description>
some description
</description>
<tax />
<value>270.50</value>
<quantity />
</part>
<part>
<part-no>890304</part-no>
<description>
some description
</description>
<tax />
<value>270.50</value>
<quantity />
</part>
</parts>
<part-number>139186</part-number>
</line-item>
</line-items>
</invoice>
</invoices>
</statement>
Using linq, what is the best way to do this without creating a new XDocument?
I tried this but I'm new to linq and don't quite understand how to achieve this without using FirstOrDefault().
statementFile.ReplaceNodes(
from invoice in statementFile.Descendants("invoices")
from lineItem in invoice.Descendants("line-items")
from part in lineItem.Descendants("parts")
where part.Element("part-no").Value.Equals("99999")
select part.ReplaceWith(updatedPart));
);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论