从XML文件编辑(删除条目),没有与现有字符串匹配的换行符

时间:2014-03-07 20:00:11

标签: xml batch-file vbscript

好的,这是设置:

Stamps.com运输软件将每个Marketplace的订单存储在一个“.b”文件中,该文件在结构中是一个没有换行符的XML文件 - 因此它是一个非常非常长的字符串。

但该软件并非旨在允许非Stamps.com发货的订单 - 因此UPS或FedEx发货的订单仍保留在数据库中。

并且Stamps.com不会在下次导入时重新验证订单 - 如果订单在市场中被标记为已取消,它将不会在软件中移至“已取消”状态,也不会按顺序移动“已发货”使用“发货”的竞争对手的有效追踪号码 - 所以我需要逐个手动检查UPS / FedEx的每个订单。

这就是我需要的:

我在一天结束时从UPS出口。我想从此文件中获取订单号列,并使用脚本从Stamps.com数据库文件中删除该记录。

正如我所说,XML文件是一行没有中断的,我不确定我是否可以在这里重新发布文件中的记录信息 - 但只需从单个记录中说出所有内容包含在“......”和“......”之间。它包含“[data]”中的订单ID。

所以我有一个带有唯一可识别字符串的记录的开头和结尾。我有一个当天发货的订单ID列表。如何创建一个脚本(Batch,VBScript等)来删除包含该字符串的XML数据库中的所有条目?它可以节省大量时间来激活代码以自动删除无关信息。

可以在VBScript中完成吗?批次?

<?xml version="1.0" encoding="UTF-8"?>
<Print xmlns="http://stamps.com/xml/namespace/2009/8/Client/BatchProcessingV1">
  <Configuration>
    <MailingCutoffTime>00:00:00</MailingCutoffTime>
  </Configuration>
  <Layout>
    <Desired>
      <PaperID>1</PaperID>
    </Desired>
  </Layout>


  <Item>
    <BillingAddress>
      <City>Anywhere</City>
      <Country>United States</Country>
      <OrderedEmailAddresses>
        <Address>none@nomail.com</Address>
      </OrderedEmailAddresses>
      <LastName>Doe</LastName>
      <MultilineAddress>
        <Line>123 Any Ln</Line>
      </MultilineAddress>
      <OrderedPhoneNumbers>
        <Number>555 555 4444</Number>
      </OrderedPhoneNumbers>
      <ZIP>12345</ZIP>
      <State>KS</State>
    </BillingAddress>
    <HidePostageAmount>true</HidePostageAmount>
    <Identity> [some number] </Identity>
    <ShippingProfile>
      <Identity> [some number] </Identity>
    </ShippingProfile>
    <MailClass>first class</MailClass>
    <Mailpiece>package</Mailpiece>
    <OrderContents>
      <Item>
        <ExternalID> [some number] </ExternalID>
        <Name> [Item Title] </Name>
        <Price>9.98</Price>
        <Quantity>1</Quantity>
        <Total>9.98</Total>
      </Item>
      <Item>
        <ExternalID> [some number] </ExternalID>
        <Name> [Item Title]</Name>
        <Price>12.98</Price>
        <Quantity>1</Quantity>
        <Total>12.98</Total>
      </Item>
    </OrderContents>
    <OrderDate>2014-03-12</OrderDate>
    <OrderID> **[This is the ORDER ID I want to look for]** </OrderID>
    <ShipMethod>ShippingMethodStandard</ShipMethod>
    <Recipient>
      <AddressFields>
        <City>Anywhere</City>
        <CleanseCode> [96-digit code that I have zero clue what it does, nor does Stamps.com tech support] </CleanseCode>
        <Company></Company>
        <Country>United States</Country>
        <Department></Department>
        <OrderedEmailAddresses>
          <Address>ghost@nomail.com</Address>
        </OrderedEmailAddresses>
        <FirstName>John</FirstName>
        <LastName>Doe</LastName>
        <MiddleName></MiddleName>
        <MultilineAddress>
          <Line>123 Any Ln</Line>
        </MultilineAddress>
        <NamePrefix></NamePrefix>
        <NameSuffix></NameSuffix>
        <OrderedPhoneNumbers>
          <Number>555 555 4444</Number>
        </OrderedPhoneNumbers>
        <ZIP>12345-6789</ZIP>
        <State>KS</State>
        <Title></Title>
      </AddressFields>
    </Recipient>
    <RecipientEmailOptions>
      <ShipmentNotification>true</ShipmentNotification>
    </RecipientEmailOptions>
    <Sender>
      <City>OurCity</City>
      <LastName>OurCompany</LastName>
      <MultilineAddress>
        <Line>123 OurAddress</Line>
      </MultilineAddress>
      <OrderedPhoneNumbers>
        <Number>800-Our-Fone</Number>
      </OrderedPhoneNumbers>
      <ZIP> [Our ZIP]</ZIP>
      <State> [Our State] </State>
    </Sender>
    <Services>
      <TrackingService>DeliveryConfirmation</TrackingService>
    </Services>
  </Item>


</Print>

基本上,这是与一批货物有关的所有信息的“块”。 “阻止”以<Item><BillingaAddress>开头,以</TrackingService></Services></Item>结尾。如果在该区域内,字段<OrderID> ORDER ID </OrderID>匹配字符串,我需要清除整个块。

我已经格式化了上面的代码以便于阅读,但是在文件中根本没有标记之间的空格或空格。我认为它必须保持软件才能阅读它。

1 个答案:

答案 0 :(得分:0)

@ECHO OFF
SETLOCAL
:: delete tempfiles
FOR /l %%z IN (1,1,3) DO DEL q22259592.%%z 2>nul
:: create sane file
(
FOR /f "delims=" %%a IN ('sed -e s/\x3E/\x3E\n/g -e s/\x3C/\n\x3C/g q22259592.txt') do echo(%%a
)>q22259592.1
:: find target line numbers
CALL :zapvars
FOR /f "tokens=1*delims=:" %%a IN ('findstr /n /r "$" q22259592.1') DO (
 SET "line=%%b"
 IF "%%b"=="<Item>" SET /a item=%%a
 IF "%%b"=="<BillingAddress>" CALL :billing %%a

 IF DEFINED oidb CALL :ordnum %%a

 IF "%%b"=="</OrderID>" CALL :oide %%a

 IF DEFINED se IF "%%b"=="</Item>" CALL :endb %%a
 SET "se="
 IF DEFINED tse IF "%%b"=="</Services>" SET /a se=%%a
 SET "tse="
 IF "%%b"=="</TrackingService>" SET /a tse=%%a
 IF "%%b"=="<OrderID>" SET oidb=%%a
)

sed -f q22259592.2 q22259592.1|sed -e :a;N;$!ba;s/\n//g >q22259592.3 
GOTO :EOF

:endb
IF DEFINED target >>q22259592.2 ECHO %itemb%,%1D
:zapvars
FOR %%z IN (itemb tse se target) DO SET "%%z="
GOTO :eof


:: BillingAddress line
:billing
SET /a result=%item%+1
:: If sequential Item and BillingAddress lines, new block
IF %result%==%1 CALL :zapvars&SET /a itemb=%item%
GOTO :eof

:: OrderID
:ordnum
SET "oidb="
FINDSTR /b /e /l /c:"%line%" q22259592.zap >NUL
IF ERRORLEVEL 1 (SET /a target=0) ELSE (SET /a target=1+%1)
GOTO :eof

:: /OrderID
:oide
:: Leave Target set only if /OrderID follows immediately
IF NOT "%target%"=="%1" SET "target="
GOTO :eof

我使用GNUSED和一个名为q22259592.txt的文件进行测试。

首先在每个&gt; &lt; 之后插入换行符,然后从结果中删除所有空行并存入filename.1

下一步是读取结果文件,对每一行进行编号并记录重要行的行号 - 块的开头(itemb)以及目标行是否包含{{1}中的一个字符串 - 要删除的项目文件。

在到达q22259592.zap行时,如果找到了将删除从</Item>到当前(SED)行的行的目标,则会生成itemb命令。

为了处理每一行,</Item>使用SED文件从.2文件中删除相应的行,然后删除所有换行并生成.1文件

...应该包含所需的数据。

当然,文件的名称并不重要。

文件.3是一个简单的文本文件,其中包含要删除的OrderID列表,一行到一行。