使用 Xdocument 修改 XML 元素

问题描述 投票:0回答:1

我正在尝试修改 xml 文件中 FromModifiedDate 行的日期 我首先想显示更改之前的日期,但我不知道如何遍历此 xml 文件以获取 FromModifiedDate for next 循环中的 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")

第二个写入行输出 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>
xml vb.net
1个回答
0
投票

请尝试以下利用 LINQ to XML API 功能的解决方案。

无需任何循环。

c#

void Main()
{
    const string FILENAME = @"e:\Temp\BillQuery.xml";
    string FromModifiedDate_New = "2024-05-16";

    XDocument xdoc = XDocument.Load(FILENAME);

    var FromModifiedDate = xdoc.Descendants("FromModifiedDate")?.SingleOrDefault().Value;
    if (!string.IsNullOrEmpty(FromModifiedDate))
    {
        // just to see original value
        Console.WriteLine(FromModifiedDate);
        
        // modify value
        XElement xelem = xdoc.Descendants("FromModifiedDate").SingleOrDefault();
        xelem.SetValue(FromModifiedDate_New);
    }
}

输出

2021-01-01

<?qbxml version="16.0"?>
<QBXML>
  <QBXMLMsgsRq onError="stopOnError">
    <BillQueryRq>
      <ModifiedDateRangeFilter>
        <!-- optional -->
        <FromModifiedDate>2024-05-16</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>
© www.soinside.com 2019 - 2024. All rights reserved.