Как запросить повторяющиеся дочерние узлы XML внутри родительских повторяющихся узлов?

Проблема заключается в том, что переменная counter не разделяется между вашими процессами: каждый отдельный процесс создает собственный локальный экземпляр и увеличивает его.

См. в этом разделе документацию для некоторых методов, которые вы можете использовать для совместного использования состояния между вашими процессами. В вашем случае вы можете поделиться экземпляром Value между вашими работниками

. Вот рабочая версия вашего примера (с некоторыми фиктивными входными данными). Обратите внимание, что он использует глобальные значения, которые я действительно пытался бы избежать на практике:

from multiprocessing import Pool, Value
from time import sleep

counter = None

def init(args):
    ''' store the counter for later use '''
    global counter
    counter = args

def analyze_data(args):
    ''' increment the global counter, do something with the input '''
    global counter
    # += operation is not atomic, so we need to get a lock:
    with counter.get_lock():
        counter.value += 1
    print counter.value
    return args * 10

if __name__ == '__main__':
    #inputs = os.listdir(some_directory)

    #
    # initialize a cross-process counter and the input lists
    #
    counter = Value('i', 0)
    inputs = [1, 2, 3, 4]

    #
    # create the pool of workers, ensuring each one receives the counter 
    # as it starts. 
    #
    p = Pool(initializer = init, initargs = (counter, ))
    i = p.map_async(analyze_data, inputs, chunksize = 1)
    i.wait()
    print i.get()

0
задан Marc 16 January 2019 в 21:46
поделиться

1 ответ

Вам нужно объявить свои пространства имен для извлечения данных:

DECLARE @XML xml = '<efs:Request 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xmlns:efs="http://www.slsot.org/efs" 
xsi:schemaLocation="http://www.slsot.org/efs 
http://efs.slsot.org/efs/xsd/SlsotEfsSchema2.xsd">
  <EfsVersion>2.0</EfsVersion>
  <Batch BatchType="N" AgLicNo="12345" ItemCnt="69">
    <EFSPolicy>
      <PolicyNumber>POL12345</PolicyNumber>
      <Binder>0086592YZ</Binder>
      <TransType>N</TransType>
      <Insured>Dummy Co LLC</Insured>
      <ZipCode>75225</ZipCode>
      <ClassCd>99930</ClassCd>
      <PolicyFee>35.00</PolicyFee>
      <TotalTax>36.62</TotalTax>
      <TotalStampFee>1.13</TotalStampFee>
      <TotalGross>792.75</TotalGross>
      <EffectiveDate>09/17/2018</EffectiveDate>
      <ExpirationDate>09/17/2019</ExpirationDate>
      <IssueDate>09/20/2018</IssueDate>
      <ContUntilCancl>N</ContUntilCancl>
      <FedCrUnion>N</FedCrUnion>
      <AORFlag>N</AORFlag>
      <CustomID>043684</CustomID>
      <WindStormExclusion>N</WindStormExclusion>
      <CorrectionReEntry>N</CorrectionReEntry>
      <Coverages>
        <Coverage CvgCode="9325">720.00</Coverage>
      </Coverages>
      <Securities>
        <Company CoNumber="80101168">100.00</Company>
      </Securities>
    </EFSPolicy>
    <EFSPolicy>
    </EFSPolicy>
  </Batch>
</efs:Request>';

WITH XMLNAMESPACES('http://www.w3.org/2001/XMLSchema-instance' as xsi,
                   'http://www.slsot.org/efs' AS efs)
SELECT EFS.[Policy].value('(./PolicyNumber/text())[1]','varchar(25)') AS PolicyNumber,
       EFS.[Policy].value('(./Coverages/Coverage/@CvgCode)[1]','int') AS CvgCode --Assumes only 1 CvgCode per policy
FROM (VALUES(@XML)) V(X)
     CROSS APPLY V.X.nodes('efs:Request/Batch/EFSPolicy') EFS([Policy]);
0
ответ дан Larnu 16 January 2019 в 21:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: