Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Processing an XML file to VFP cursors
Message
From
20/05/2004 14:15:23
 
General information
Forum:
Visual FoxPro
Category:
XML, XSD
Miscellaneous
Thread ID:
00904549
Message ID:
00905739
Views:
29
>Hi Aleksey,
>
>I have a question related to this that I did not think of at first.
>Once you create the cursors you lose the relationship between them.
>Any ideas as to how to maintain these relationships ?
>
>Thanks in advance
>Carmel

Hi Carmel,

You can use XPath scripting to pull FOREIGN KEY fields from parent element. The example is below. Also, you can use XMLTable.ChildTable to achieve the same goal. See message #778196 and message #782029 for more examples.
CLOSE DATABASES all
CLEAR

CREATE CURSOR customer ;
(;
customer_number c(6),;
address_id I,;
name c(20);
)

CREATE CURSOR sales ;
(;
customer_number c(6) NULL,;
name c(20),;
email c(20),;
price_profile c(10),;
price_profile_email c(50);
)

CREATE CURSOR billing;
(;
customer_number c(6) NULL,;
address_id I,;
title c(20),;
firstname c(20),;
lastname c(20),;
company c(30);
)

LOCAL oXA as XMLAdapter, oXT as XMLTable

oXA=CREATEOBJECT("XMLAdapter")
oXA.LoadXML(GetXML())

oXA.AddTableSchema("customer")
oXT=oXA.AddTableSchema("sales")
SetRefToCustomer(oXT)
oXT=oXA.AddTableSchema("billing")
SetRefToCustomer(oXT)

FOR EACH oXT IN oXA.Tables
	oXT.ToCursor(.T.)
	SELECT (oXT.Alias)
	?ALIAS()
	LIST
NEXT 

FUNCTION SetRefToCustomer(oXT as XMLTable)
* assume that customer_number is enough	
LOCAL oXF as XMLField

nIndex=oXT.Fields.GetKey(STRCONV("customer_number",5))
oXF=oXT.Fields(nIndex)
oXT.Fields.Remove(nIndex)

* undocumented trick, use on your own risk
* use XPath expression in place of XMLName
oXF.XMLName=STRCONV("parent::customer/customer_number",5)
oXT.Fields.Add(oXF,oXF.XMLName,nIndex)
ENDFUNC 


FUNCTION GetXML()

TEXT TO cXML NOSHOW
<?xml version="1.0" encoding="UTF-8"?>
<export_customers_response>
  <authentication>
    <revision>2.0</revision>
    <reseller_shortcut>eric</reseller_shortcut>
    <user_email>test@test.com</user_email>
  </authentication>
  <customers>
    <customer>
      <customer_number>AC0127</customer_number>
      <address_id>626</address_id>
      <name>acme corp</name>
      <address1>1234 lane ave</address1>
      <address2 />
      <address_line1>1234 lane ave</address_line1>
      <address_line2 />
      <city>powell</city>
      <state>Ohio</state>
      <state_abbrv>OH</state_abbrv>
      <zip>43065</zip>
      <country>United States</country>
      <country_abbrv>USA</country_abbrv>
      <phone />
      <fax />
      <website />
      <lead_source />
      <tax_exempt />
      <tax_id />
      <comments />
      <terms>No Terms</terms>
      <credit_limit />
      <sales>
        <name>Lundin, Eric</name>
        <email>eric.lundin@cnet.com</email>
        <price_profile>22% Mark-Up</price_profile>
        <price_profile_email>channelsupport@cnet.com</price_profile_email>
      </sales>
      <billing>
        <address_id>627</address_id>
        <title />
        <firstname>pat</firstname>
        <lastname>leneghan</lastname>
        <company>acme corp</company>
        <address1>1234 lane ave</address1>
        <address2 />
        <city>powell</city>
        <state>Ohio</state>
        <state_abbrv>OH</state_abbrv>
        <zip>43065</zip>
        <country>United States</country>
        <phone />
        <extension />
      </billing>
      <shipping>
        <address_id>627</address_id>
        <title />
        <firstname>pat</firstname>
        <lastname>leneghan</lastname>
        <company>acme corp</company>
        <address1>1234 lane ave</address1>
        <address2 />
        <city>powell</city>
        <state>Ohio</state>
        <state_abbrv>OH</state_abbrv>
        <zip>43065</zip>
        <country>United States</country>
        <phone />
        <extension />
      </shipping>
      <contact>
        <address_id>166722</address_id>
        <title />
        <firstname>pat</firstname>
        <lastname>leneghan</lastname>
        <company>acme corp</company>
        <address1>1234 lane ave</address1>
        <address2 />
        <city>powell</city>
        <state>Ohio</state>
        <state_abbrv>OH</state_abbrv>
        <zip>43065</zip>
        <country>United States</country>
        <phone />
        <extension />
        <home_phone />
        <home_extension />
        <fax />
        <fax_extension />
        <email>pleneghan@aol.com</email>
        <mobile />
        <mobile_extension />
        <pager />
        <website />
        <other />
        <other_extension />
      </contact>
    </customer>
  </customers>
</export_customers_response>
ENDTEXT 

RETURN cXML
ENDFUNC
Thanks,
Aleksey.
Previous
Next
Reply
Map
View

Click here to load this message in the networking platform