You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用XDocument遍历XML获取并修改FromModifiedDate节点的问题

问题描述

想要修改XML文件中<FromModifiedDate>节点的日期,先查看修改前的日期,但遍历XML定位该节点时,循环内的Console.WriteLine从未输出预期内容。

当前代码

Dim document1 As XDocument = XDocument.Load("C:\QuickBooks Shared\SDKTestPlus3\BillQuery.xml")

'  For Each ModifiedDateRangeFilter In From element In document1.<QBXML>.<QBXMLMsgsRq>.<BillQueryRq>.<ModifiedDateRangeFilter>
'ModifiedDateRangeFilter.<FromModifiedDate>.value = "2021-01-01"
'  Next
For Each daterange As XElement In document1.Descendants("ModifiedDateRangeFilter")
    Console.WriteLine(daterange.Elements("FromModifiedDate"))
Next

Console.WriteLine(document1.Root.Element("QBXMLMsgsRq").<BillQueryRq>.Value)
'.Elements("ModifiedDateRangeFilter").Elements("FromModifiedDate")

第二条Console.WriteLine输出

2021-01-012023-12-311TxnIDTimeCreatedTimeModifiedVendorRefVendorAddressAPAccountRefTxnDateDueDateAmountDueIsPendingTermsRefIsPaidOpenAmount

对应XML文件内容

<?xml version="1.0" encoding="utf-8"?>
<?qbxml version="16.0"?>
<QBXML>
    <QBXMLMsgsRq onError="stopOnError">
        <BillQueryRq>
            <ModifiedDateRangeFilter> <!-- optional -->
                <FromModifiedDate>2021-01-01</FromModifiedDate> <!-- optional -->
                <ToModifiedDate>2023-12-31</ToModifiedDate> <!-- optional -->
            </ModifiedDateRangeFilter>
            <IncludeLineItems >1</IncludeLineItems> <!-- optional -->
            <IncludeRetElement >TxnID</IncludeRetElement> <!-- optional, may repeat -->
            <IncludeRetElement >TimeCreated</IncludeRetElement> <!-- optional, may repeat -->
            <IncludeRetElement >TimeModified</IncludeRetElement> <!-- optional, may repeat -->
            <IncludeRetElement >VendorRef</IncludeRetElement> <!-- optional, may repeat -->
            <IncludeRetElement >VendorAddress</IncludeRetElement> <!-- optional, may repeat -->
            <IncludeRetElement >APAccountRef</IncludeRetElement> <!-- optional, may repeat -->
            <IncludeRetElement >TxnDate</IncludeRetElement> <!-- optional, may repeat -->
            <IncludeRetElement >DueDate</IncludeRetElement> <!-- optional, may repeat -->
            <IncludeRetElement >AmountDue</IncludeRetElement> <!-- optional, may repeat -->
            <IncludeRetElement >IsPending</IncludeRetElement> <!-- optional, may repeat -->
            <IncludeRetElement >TermsRef</IncludeRetElement> <!-- optional, may repeat -->
            <IncludeRetElement >IsPaid</IncludeRetElement> <!-- optional, may repeat -->
            <IncludeRetElement >OpenAmount</IncludeRetElement> <!-- optional, may repeat -->
        </BillQueryRq>
    </QBXMLMsgsRq>
</QBXML>
解决方案

问题原因

循环内的Console.WriteLine(daterange.Elements("FromModifiedDate"))直接输出的是IEnumerable(Of XElement)集合对象,而非节点的文本值,所以看不到预期的日期内容。当前XML无命名空间,不存在命名空间匹配问题。

正确代码示例

Dim document1 As XDocument = XDocument.Load("C:\QuickBooks Shared\SDKTestPlus3\BillQuery.xml")

' 遍历节点,获取并输出修改前的日期值
For Each daterange As XElement In document1.Descendants("ModifiedDateRangeFilter")
    Dim fromDateElement = daterange.Element("FromModifiedDate")
    If fromDateElement IsNot Nothing Then
        Console.WriteLine($"修改前的FromModifiedDate值:{fromDateElement.Value}")
        ' 修改日期值
        fromDateElement.Value = "2024-01-01"
    End If
Next

' 保存修改后的XML文件
document1.Save("C:\QuickBooks Shared\SDKTestPlus3\BillQuery_Updated.xml")

' 验证修改结果
Dim updatedDoc As XDocument = XDocument.Load("C:\QuickBooks Shared\SDKTestPlus3\BillQuery_Updated.xml")
Dim updatedFromDate = updatedDoc.Descendants("FromModifiedDate").FirstOrDefault()
If updatedFromDate IsNot Nothing Then
    Console.WriteLine($"修改后的FromModifiedDate值:{updatedFromDate.Value}")
End If

关键说明

  • 使用Element("FromModifiedDate")获取单个节点(而非Elements()返回集合),再通过Value属性获取节点文本内容。
  • 增加空值判断,避免节点不存在时引发异常。
  • 修改完成后调用Save()方法持久化XML文件。

内容的提问来源于stack exchange,提问作者Robert Allen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 02:17:03