Eddie Shipman
asked on
TXMLDocument Pain...
Having never messed with the TXMLDocument object before, personally I think it is a piece of junk, I am running into a problem.
I am very well versed in using MSXML but this stuff is so foreign and feels dumb.
I am trying to write an overloaded function to return a IDOMNodeList using XPath when passed either an IDOMNode or an
IDOMElement:
function GetNodeList(Node: IDOMNode; XPath: String): IDOMNodeList; overload;
begin
Result := (Node as IDOMNodeSelect).selectNode s(XPath);
end;
function GetNodeList(Elem: IDOMElement; XPath: String): IDOMNodeList; overload;
begin
Result := (Elem as IDOMNodeSelect).selectNode s(XPath);
end;
I need to return the nodes according to this call:
list := GetNodeList(xml.DOMDocumen t.document Element, '//JournalReport');
However, it is always returning an empty list. Any ideas?
I've tried these with the same result:
list := GetNodeList(xml.DOMDocumen t.document Element.Fi rstChild, '//JournalReport');
list := GetNodeList(xml.DOMDocumen t.document Element.Pa rentNode, '//JournalReport');
here is a snippet of the XML trying to parse:
<?xml version="1.0" encoding="utf-8"?>
<NAXML-POSJournal version="3.4">
<TransmissionHeader>
<snipped other nodes and values>
</TransmissionHeader>
<JournalReport>
<JournalHeader>
<snipped other nodes and values>
</JournalHeader>
<SaleEvent>
<snipped other nodes and values>
<TransactionDetailGroup>
<TransactionLine>
<snipped other nodes and values>
<TenderInfo>
<Tender>
<TenderCode/>
<TenderSubCode/>
</Tender>
<TenderAmount/>
<ChangeFlag/>
</TenderInfo>
</TransactionLine>
</TransactionDetailGroup>
<TransactionSummary>
<snipped other nodes and values>
</TransactionSummary>
</SaleEvent>
</JournalReport>
</NAXML-POSJournal>
This functionality MUST also work on an earlier VERSION of the XML file formatted like this:
{Note the differences in the Tender(3.2) and TenderInfo(3.4) nodes}
<?xml-version ="1.0" standalone="no"?>
<NAXML-POSJournal version="3.2">
<TransmissionHeader>
<snipped other nodes and values>
</TransmissionHeader>
<JournalReport>
<JournalHeader>
<snipped other nodes and values>
</JournalHeader>
<SaleEvent>
<snipped other nodes and values>
<TransactionDetailGroup>
<TransactionLine>
<snipped other nodes and values>
<Tender>
<TenderCode/>
<TenderSubCode/>
<TenderAmount/>
<ChangeFlag/>
</Tender>
</TransactionLine>
</TransactionLine>
</TransactionDetailGroup>
<TransactionSummary>
<snipped other nodes and values>
</TransactionSummary>
</SaleEvent>
</JournalReport>
</NAXML-POSJournal>
I am very well versed in using MSXML but this stuff is so foreign and feels dumb.
I am trying to write an overloaded function to return a IDOMNodeList using XPath when passed either an IDOMNode or an
IDOMElement:
function GetNodeList(Node: IDOMNode; XPath: String): IDOMNodeList; overload;
begin
Result := (Node as IDOMNodeSelect).selectNode
end;
function GetNodeList(Elem: IDOMElement; XPath: String): IDOMNodeList; overload;
begin
Result := (Elem as IDOMNodeSelect).selectNode
end;
I need to return the nodes according to this call:
list := GetNodeList(xml.DOMDocumen
However, it is always returning an empty list. Any ideas?
I've tried these with the same result:
list := GetNodeList(xml.DOMDocumen
list := GetNodeList(xml.DOMDocumen
here is a snippet of the XML trying to parse:
<?xml version="1.0" encoding="utf-8"?>
<NAXML-POSJournal version="3.4">
<TransmissionHeader>
<snipped other nodes and values>
</TransmissionHeader>
<JournalReport>
<JournalHeader>
<snipped other nodes and values>
</JournalHeader>
<SaleEvent>
<snipped other nodes and values>
<TransactionDetailGroup>
<TransactionLine>
<snipped other nodes and values>
<TenderInfo>
<Tender>
<TenderCode/>
<TenderSubCode/>
</Tender>
<TenderAmount/>
<ChangeFlag/>
</TenderInfo>
</TransactionLine>
</TransactionDetailGroup>
<TransactionSummary>
<snipped other nodes and values>
</TransactionSummary>
</SaleEvent>
</JournalReport>
</NAXML-POSJournal>
This functionality MUST also work on an earlier VERSION of the XML file formatted like this:
{Note the differences in the Tender(3.2) and TenderInfo(3.4) nodes}
<?xml-version ="1.0" standalone="no"?>
<NAXML-POSJournal version="3.2">
<TransmissionHeader>
<snipped other nodes and values>
</TransmissionHeader>
<JournalReport>
<JournalHeader>
<snipped other nodes and values>
</JournalHeader>
<SaleEvent>
<snipped other nodes and values>
<TransactionDetailGroup>
<TransactionLine>
<snipped other nodes and values>
<Tender>
<TenderCode/>
<TenderSubCode/>
<TenderAmount/>
<ChangeFlag/>
</Tender>
</TransactionLine>
</TransactionLine>
</TransactionDetailGroup>
<TransactionSummary>
<snipped other nodes and values>
</TransactionSummary>
</SaleEvent>
</JournalReport>
</NAXML-POSJournal>
ASKER
I still get AV's using both those methods on my document.
Here, I'll post the entire 3.4 XML for you to try...
Seems the xmlns is causing the problem.
Any way around that?
<?xml version="1.0" encoding="utf-8"?>
<NAXML-POSJournal xmlns="http://www.naxml.org/POSBO/Vocabulary/2003-10-16" version="3.4" release="3.4.0">
<TransmissionHeader>
<StoreLocationID>6059</Sto reLocation ID>
<VendorName>Gilbarco-Veede rRoot</Ven dorName>
<VendorModelVersion>5.00.2 7.01A Shell Network</VendorModelVersio n>
</TransmissionHeader>
<JournalReport>
<JournalHeader>
<ReportSequenceNumber/>
<PrimaryReportPeriod>2</Pr imaryRepor tPeriod>
<SecondaryReportPeriod>0</ SecondaryR eportPerio d>
<BeginDate>2006-08-25</Beg inDate>
<BeginTime>03:38:45</Begin Time>
<EndDate>2100-01-01</EndDa te>
<EndTime>00:00:00</EndTime >
</JournalHeader>
<SaleEvent>
<TrainingModeFlag value="No"/>
<CashierID>9</CashierID>
<RegisterID>1</RegisterID>
<TillID>000000000147</Till ID>
<OutsideSalesFlag value="No"/>
<TransactionID>2587</Trans actionID>
<EventStartDate>2006-08-26 </EventSta rtDate>
<EventStartTime>02:56:22</ EventStart Time>
<EventEndDate>2006-08-26</ EventEndDa te>
<EventEndTime>02:56:31</Ev entEndTime >
<ReceiptDate/>
<ReceiptTime/>
<BusinessDate>2006-08-25</ BusinessDa te>
<OfflineFlag value="No"/>
<SuspendFlag value="No"/>
<TransactionDetailGroup>
<TransactionLine status="Normal">
<ItemLine>
<ItemCode>
<POSCodeFormat format="gtin"/>
<POSCode>02820000869</POSC ode>
<POSCodeModifier name="">0</POSCodeModifier >
</ItemCode>
<ItemID>028200008695</Item ID>
<Description>Marlboro Light Box</Description>
<EntryMethod>Scan</EntryMe thod>
<ActualSalesPrice>3.31</Ac tualSalesP rice>
<UnitCostPrice/>
<MerchandiseCode>18</Merch andiseCode >
<SellingUnits>1</SellingUn its>
<Discount>
<DiscountAmount>0</Discoun tAmount>
<ReasonCode/>
</Discount>
<RegularSellPrice>3.31</Re gularSellP rice>
<SalesQuantity>1</SalesQua ntity>
<SalesAmount>3.31</SalesAm ount>
</ItemLine>
</TransactionLine>
<TransactionLine status="Normal">
<TenderInfo>
<Tender>
<TenderCode>1</TenderCode>
<TenderSubCode/>
</Tender>
<TenderAmount>4</TenderAmo unt>
<ChangeFlag value="No"/>
</TenderInfo>
</TransactionLine>
<TransactionLine status="Normal">
<TenderInfo>
<Tender>
<TenderCode>1</TenderCode>
<TenderSubCode/>
</Tender>
<TenderAmount>-.51</Tender Amount>
<ChangeFlag value="Yes"/>
</TenderInfo>
</TransactionLine>
<TransactionLine status="normal">
<TransactionTax>
<TaxLevelID>101</TaxLevelI D>
<TaxableSalesAmount>3.31</ TaxableSal esAmount>
<TaxCollectedAmount>.18</T axCollecte dAmount>
</TransactionTax>
</TransactionLine>
</TransactionDetailGroup>
<TransactionSummary>
<TransactionTotalGrossAmou nt>3.31</T ransaction TotalGross Amount>
<TransactionTotalNetAmount >3.48</Tra nsactionTo talNetAmou nt>
<TransactionTotalTaxSalesA mount>.18< /Transacti onTotalTax SalesAmoun t>
<TransactionTotalTaxNetAmo unt>.18</T ransaction TotalTaxNe tAmount>
<TransactionTotalGrandAmou nt direction="Collected">3.49 </Transact ionTotalGr andAmount>
</TransactionSummary>
</SaleEvent>
</JournalReport>
</NAXML-POSJournal>
Here, I'll post the entire 3.4 XML for you to try...
Seems the xmlns is causing the problem.
Any way around that?
<?xml version="1.0" encoding="utf-8"?>
<NAXML-POSJournal xmlns="http://www.naxml.org/POSBO/Vocabulary/2003-10-16" version="3.4" release="3.4.0">
<TransmissionHeader>
<StoreLocationID>6059</Sto
<VendorName>Gilbarco-Veede
<VendorModelVersion>5.00.2
</TransmissionHeader>
<JournalReport>
<JournalHeader>
<ReportSequenceNumber/>
<PrimaryReportPeriod>2</Pr
<SecondaryReportPeriod>0</
<BeginDate>2006-08-25</Beg
<BeginTime>03:38:45</Begin
<EndDate>2100-01-01</EndDa
<EndTime>00:00:00</EndTime
</JournalHeader>
<SaleEvent>
<TrainingModeFlag value="No"/>
<CashierID>9</CashierID>
<RegisterID>1</RegisterID>
<TillID>000000000147</Till
<OutsideSalesFlag value="No"/>
<TransactionID>2587</Trans
<EventStartDate>2006-08-26
<EventStartTime>02:56:22</
<EventEndDate>2006-08-26</
<EventEndTime>02:56:31</Ev
<ReceiptDate/>
<ReceiptTime/>
<BusinessDate>2006-08-25</
<OfflineFlag value="No"/>
<SuspendFlag value="No"/>
<TransactionDetailGroup>
<TransactionLine status="Normal">
<ItemLine>
<ItemCode>
<POSCodeFormat format="gtin"/>
<POSCode>02820000869</POSC
<POSCodeModifier name="">0</POSCodeModifier
</ItemCode>
<ItemID>028200008695</Item
<Description>Marlboro Light Box</Description>
<EntryMethod>Scan</EntryMe
<ActualSalesPrice>3.31</Ac
<UnitCostPrice/>
<MerchandiseCode>18</Merch
<SellingUnits>1</SellingUn
<Discount>
<DiscountAmount>0</Discoun
<ReasonCode/>
</Discount>
<RegularSellPrice>3.31</Re
<SalesQuantity>1</SalesQua
<SalesAmount>3.31</SalesAm
</ItemLine>
</TransactionLine>
<TransactionLine status="Normal">
<TenderInfo>
<Tender>
<TenderCode>1</TenderCode>
<TenderSubCode/>
</Tender>
<TenderAmount>4</TenderAmo
<ChangeFlag value="No"/>
</TenderInfo>
</TransactionLine>
<TransactionLine status="Normal">
<TenderInfo>
<Tender>
<TenderCode>1</TenderCode>
<TenderSubCode/>
</Tender>
<TenderAmount>-.51</Tender
<ChangeFlag value="Yes"/>
</TenderInfo>
</TransactionLine>
<TransactionLine status="normal">
<TransactionTax>
<TaxLevelID>101</TaxLevelI
<TaxableSalesAmount>3.31</
<TaxCollectedAmount>.18</T
</TransactionTax>
</TransactionLine>
</TransactionDetailGroup>
<TransactionSummary>
<TransactionTotalGrossAmou
<TransactionTotalNetAmount
<TransactionTotalTaxSalesA
<TransactionTotalTaxNetAmo
<TransactionTotalGrandAmou
</TransactionSummary>
</SaleEvent>
</JournalReport>
</NAXML-POSJournal>
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Well, I do know that the URL in the value is not valid.
ASKER
Converting the entire TXMLDocument stuff in our app to use straight MSXML.
This TXMLDocument thing is crap!
This TXMLDocument thing is crap!
After I've changed
<snipped other nodes and values>
to
<snippedothernodesandvalue
procedure TForm1.Button1Click(Sender
var
list: IDOMNodeList;
begin
XMLDocument1.Active := False;
XMLDocument1.FileName := 'test.xml';
XMLDocument1.Active := True;
list := GetNodeList(XMLDocument1.D
Memo1.Lines.Add(list.item[
list := GetNodeList(XMLDocument1.D
Memo1.Lines.Add(list.item[
end;