Ich habe folgendes Beispiel Dokument:Wie Daten aus den Tags ziehen basierend auf anderen Tags
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<n1:Form109495CTransmittalUpstream xmlns="urn:us:gov:treasury:irs:ext:aca:air:7.0" xmlns:irs="urn:us:gov:treasury:irs:common" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:us:gov:treasury:irs:msg:form1094-1095Ctransmitterupstreammessage IRS-Form1094-1095CTransmitterUpstreamMessage.xsd" xmlns:n1="urn:us:gov:treasury:irs:msg:form1094-1095Ctransmitterupstreammessage">
<Form1095CUpstreamDetail RecordType="String" lineNum="1">
<RecordId>1</RecordId>
<CorrectedInd>0</CorrectedInd>
<irs:TaxYr>2015</irs:TaxYr>
<EmployeeInfoGrp>
<OtherCompletePersonName>
<PersonFirstNm>JOHN</PersonFirstNm>
<PersonMiddleNm>B</PersonMiddleNm>
<PersonLastNm>Doe</PersonLastNm>
</OtherCompletePersonName>
<PersonNameControlTxt/>
<irs:TINRequestTypeCd>INDIVIDUAL_TIN</irs:TINRequestTypeCd>
<irs:SSN>123456790</irs:SSN>
</Form1095CUpstreamDetail>
<Form1095CUpstreamDetail RecordType="String" lineNum="1">
<RecordId>2</RecordId>
<CorrectedInd>0</CorrectedInd>
<irs:TaxYr>2015</irs:TaxYr>
<EmployeeInfoGrp>
<OtherCompletePersonName>
<PersonFirstNm>JANE</PersonFirstNm>
<PersonMiddleNm>B</PersonMiddleNm>
<PersonLastNm>DOE</PersonLastNm>
</OtherCompletePersonName>
<PersonNameControlTxt/>
<irs:TINRequestTypeCd>INDIVIDUAL_TIN</irs:TINRequestTypeCd>
<irs:SSN>222222222</irs:SSN>
</EmployeeInfoGrp>
</Form1095CUpstreamDetail>
</n1:Form109495CTransmittalUpstream>
Nokogiri Verwendung Ich möchte den Wert zwischen dem <PersonFirstNm>
, <PersonLastNm>
und <irs:SSN>
für jeden <Form1095CUpstreamDetail>
extrahieren basierend auf dem <RecordId>
.
Ich habe versucht, Namespaces zu entfernen. Ich habe ein kleines Snippet gepostet, aber ich habe viele Iterationen versucht, ohne Erfolg durch das XML zu arbeiten. Dies ist das erste Mal, dass ich XML benutze, also merke ich, dass ich wahrscheinlich etwas Einfaches vermisse.
Wenn ich meine XPath gesetzt:
require 'nokogiri'
submission_doc = Nokogiri::XML(open('1094C_Request.xml'))
submissions = submission_doc.remove_namespaces
nodes = submission.xpath('//Form1095CUpstreamDetail')
Ich scheine keine Zuordnung zu haben zwischen den RecordId
und den Tags oben erwähnt, und ich bin fest auf dem nächsten zu gehen.
Die Felder sind nicht als Kinder für die RecordId
aufgeführt, so dass ich nicht darüber nachdenken kann, wie sie ihre Werte erhalten. Ich füge das vollständige Dokument als Beispiel ein, um sicherzustellen, dass ich nichts ausschließe.
Ich habe ein Array von Werten, und ich möchte die drei oben genannten Tags ziehen, wenn die RecordId innerhalb des Arrays von Zahlen enthalten ist.
Bitte lesen Sie "[mcve]", dann reduzieren Sie Ihre XML-Eingabe auf das absolute, nackte Minimum, das notwendig ist, um das Problem zu demonstrieren. Alles andere darüber hinaus verschwendet unsere Zeit, Ihnen zu helfen. Nehmen Sie sich auch Zeit, Variablen im Text zu formatieren. Das hilft denjenigen, die helfen, und denjenigen, die in Zukunft ähnliche Lösungen suchen, die Frage zu verstehen. –
Das XML ist ungültig, was zu Problemen beim Parsen führen kann.Nicht übereinstimmende Tags erzwingen, dass der Parser Korrekturen vornimmt und versucht, etwas Nützliches bereitzustellen, aber dieser Prozess kann dazu führen, dass Tags fehlen. Sie müssen herausfinden, wie Sie das XML vor dem Parsen reparieren können, wenn Sie sicherstellen möchten, dass Ihr Code einen guten Ausgangspunkt hat. Nokogiri 'submission_doc.errors' sollte nach dem Parsen" Eröffnungs- und Endmarkierung nicht übereinstimmen: Form1094CUpstreamDetail-Zeile 3 und Form1095CUpstreamDetail "zurückgeben. –
Vielen Dank @theTinMan Ich hätte diesen Fehlern mehr Aufmerksamkeit schenken sollen, es stellte sich heraus, dass die Quelle die Dateien manipulierte, bevor sie sie zur Verfügung stellten und meine XML-Probleme verursachten. Ich habe die oben genannten bearbeitet, um zu versuchen, Ihre Anfrage zu erfüllen, da ich in der Lage war, die Informationen, die Sie und die akzeptierte Antwort zur Verfügung gestellt haben, weiter zu verwenden. Lektion gelernt und entschuldigt sich für die Kopfschmerzen und Probleme verursacht. – StoutPanda