You can solve this by shreding the data into the two tables by using the nodes functions. I have created this example:
--create our tables
CREATE TABLE Jobs (JobCode INT PRIMARY KEY CLUSTERED, Title VARCHAR(100))
CREATE TABLE Locations (JobCode INT, Description VARCHAR(100))
ALTER TABLE Locations ADD CONSTRAINT FK_Locations_Jobs FOREIGN KEY(JobCode) REFERENCES Jobs(Jobcode)
--load data into variable
DECLARE @xml XML
SET @xml = '<jobs>
<job>
<jobCode>12345</jobCode>
<title>.NET Developer</title>
<locations>
<location>
<description>New York</description>
</location>
<location>
<description>Philadelphia</description>
</location>
</locations>
</job>
<job>
<jobCode>67890</jobCode>
<title>Database Administrator</title>
<locations>
<location>
<description>New York</description>
</location>
<location>
<description>Denver</description>
</location>
</locations>
</job>
</jobs>'
--insert our data into jobs
INSERT INTO Jobs
SELECT t.c.value('(jobCode/text())[1]', 'int')
, t.c.value('(title/text())[1]', 'varchar(100)')
FROM @xml.nodes('/jobs/job') T(c)
--insert our data into locations
INSERT INTO Locations
SELECT t.c.value('(jobCode/text())[1]', 'int')
, u.c.value('(description/text())[1]', 'varchar(100)')
FROM @xml.nodes('/jobs/job') T(c)
CROSS APPLY T.c.nodes('locations/location') u(c)
SELECT * FROM Jobs
SELECT * FROM Locations
this create two tables Jobs and locations and there is a foreign key from locations -> jobs. The first insert statement shreds the job data into the Jobs table and the second insert statement shreds the location data into the locations table.