Solved
XPath query string problem
Posted on 2004-08-03
I am parsing a Delphi DFM form file that has been converted to XML and
I want to retrieve all nodes that have a TabOrder or ObjectProperty.PropertyType.Name
element but not a HelpContext element, but only if they are not a TCSObject element.
This doesn't work:
//*[(@type="object") and (not (TCSObject)) and (not(HelpContext)) and ((TabOrder) or (ObjectProperty.PropertyType.Name))]
Using MSXML4 this doesn't work either, it returns an Unknown Method "-->local-name()<--" error
//*[(@type="object") and (not (local-name()="TCSObject")) and (not(HelpContext)) and ((TabOrder) or (ObjectProperty.PropertyType.Name))]
Here is a snippet of the XML. In this sample, I only want to return
these nodes:
<TPanel name="FHeaderPanel" type="object">
<TLabel name="FDepartmentLabel" type="object">
<TLabel name="FAccountLabel" type="object">
<TCSComboBox name="FDepartmentCombo" type="object">
<TCSMaskEdit name="FAccountIDEdit" type="object">
<?xml version="1.0"?>
<TIssueEditForm name="IssueEditForm" type="object">
<Left type="smallint">311</Left>
<Top type="smallint">221</Top>
<Width type="smallint">569</Width>
<Height type="smallint">493</Height>
<Caption type="string">Issue</Caption>
<Color type="identifier">clBtnFace</Color>
<Font.Charset type="identifier">DEFAULT_CHARSET</Font.Charset>
<Font.Color type="identifier">clWindowText</Font.Color>
<Font.Height type="shortint">-11</Font.Height>
<Font.Name type="string">MS Sans Serif</Font.Name>
<Font.Style type="set">[]</Font.Style>
<Menu type="identifier">FMainMenu</Menu>
<OldCreateOrder type="boolean">False</OldCreateOrder>
<OnClose type="identifier">FormClose</OnClose>
<OnCreate type="identifier">FormCreate</OnCreate>
<OnShow type="identifier">FormShow</OnShow>
<PixelsPerInch type="shortint">96</PixelsPerInch>
<TextHeight type="shortint">13</TextHeight>
<TPanel name="FHeaderPanel" type="object">
<Left type="shortint">0</Left>
<Top type="shortint">0</Top>
<Width type="smallint">561</Width>
<Height type="smallint">237</Height>
<Align type="identifier">alTop</Align>
<BevelOuter type="identifier">bvNone</BevelOuter>
<TabOrder type="shortint">0</TabOrder>
<TLabel name="FDepartmentLabel" type="object">
<Left type="shortint">4</Left>
<Top type="shortint">8</Top>
<Width type="shortint">58</Width>
<Height type="shortint">13</Height>
<Caption type="string">Department:</Caption>
</TLabel>
<TLabel name="FAccountLabel" type="object">
<Left type="shortint">4</Left>
<Top type="shortint">113</Top>
<Width type="shortint">43</Width>
<Height type="shortint">13</Height>
<Caption type="string">Account:</Caption>
</TLabel>
<TCSLabel name="FProductLabel" type="object">
<Left type="shortint">4</Left>
<Top type="shortint">29</Top>
<Width type="shortint">40</Width>
<Height type="shortint">13</Height>
<HelpContext type="smallint">9236</HelpContext>
<Caption type="string">Product:</Caption>
<ObjectProperty.PropertyType.Name type="string">Unknown
</ObjectProperty.PropertyType.Name>
<ObjectProperty.PropertyType.DataType.DataType type="shortint">0
</ObjectProperty.PropertyType.DataType.DataType>
<ObjectProperty.PropertyType.DispatchID type="shortint">0
</ObjectProperty.PropertyType.DispatchID>
</TCSLabel>
<TCSComboBox name="FDepartmentCombo" type="object">
<Left type="shortint">63</Left>
<Top type="shortint">4</Top>
<Width type="smallint">205</Width>
<Height type="shortint">21</Height>
<Content type="identifier">cbcDepartments</Content>
<ObjectProperty.ObjectControl type="identifier">FDepartmentObject
</ObjectProperty.ObjectControl>
<ObjectProperty.PropertyType.Name type="string">Surrogate
</ObjectProperty.PropertyType.Name>
<ObjectProperty.PropertyType.DataType.DataType type="shortint">8
</ObjectProperty.PropertyType.DataType.DataType>
<ObjectProperty.PropertyType.DispatchID type="shortint">1
</ObjectProperty.PropertyType.DispatchID>
<ObjectProperty.PropertyType.AutoUpdate type="boolean">False
</ObjectProperty.PropertyType.AutoUpdate>
<AllowBlank type="boolean">False</AllowBlank>
<ReadOnly type="boolean">False</ReadOnly>
<Activate type="boolean">True</Activate>
<BorderColor type="identifier">clBtnShadow</BorderColor>
<Flat type="boolean">True</Flat>
<ShowBorder type="boolean">True</ShowBorder>
<Style type="identifier">csDropDownList</Style>
<ItemHeight type="shortint">13</ItemHeight>
<TabOrder type="shortint">0</TabOrder>
<OnChange type="identifier">DepartmentChange</OnChange>
<ControlRights type="identifier">crInherited</ControlRights>
</TCSComboBox>
<TCSMaskEdit name="FProductIDEdit" type="object">
<Left type="shortint">63</Left>
<Top type="shortint">25</Top>
<Width type="smallint">184</Width>
<Height type="shortint">21</Height>
<HelpContext type="smallint">9236</HelpContext>
<ReadOnly type="boolean">False</ReadOnly>
<TabOrder type="shortint">1</TabOrder>
<OnChange type="identifier">IDChange</OnChange>
<OnExit type="identifier">IDExit</OnExit>
<ObjectProperty.ObjectControl type="identifier">FProductObject
</ObjectProperty.ObjectControl>
<ObjectProperty.PropertyType.Name type="string">ID
</ObjectProperty.PropertyType.Name>
<ObjectProperty.PropertyType.DataType.DataType type="shortint">8
</ObjectProperty.PropertyType.DataType.DataType>
<ObjectProperty.PropertyType.DispatchID type="shortint">2
</ObjectProperty.PropertyType.DispatchID>
<ObjectProperty.PropertyType.AutoUpdate type="boolean">False
</ObjectProperty.PropertyType.AutoUpdate>
<Activate type="boolean">True</Activate>
<BorderColor type="identifier">clBtnShadow</BorderColor>
<Flat type="boolean">True</Flat>
<ShowBorder type="boolean">True</ShowBorder>
<ControlRights type="identifier">crInherited</ControlRights>
</TCSMaskEdit>
<TCSMaskEdit name="FAccountIDEdit" type="object">
<Left type="shortint">63</Left>
<Top type="shortint">109</Top>
<Width type="smallint">184</Width>
<Height type="shortint">21</Height>
<ReadOnly type="boolean">False</ReadOnly>
<TabOrder type="shortint">6</TabOrder>
<OnChange type="identifier">IDChange</OnChange>
<OnExit type="identifier">IDExit</OnExit>
<ObjectProperty.ObjectControl type="identifier">FAccountObject
</ObjectProperty.ObjectControl>
<ObjectProperty.PropertyType.Name type="string">ID
</ObjectProperty.PropertyType.Name>
<ObjectProperty.PropertyType.DataType.DataType type="shortint">8
</ObjectProperty.PropertyType.DataType.DataType>
<ObjectProperty.PropertyType.DispatchID type="shortint">2
</ObjectProperty.PropertyType.DispatchID>
<ObjectProperty.PropertyType.AutoUpdate type="boolean">False
</ObjectProperty.PropertyType.AutoUpdate>
<Activate type="boolean">True</Activate>
<BorderColor type="identifier">clBtnShadow</BorderColor>
<Flat type="boolean">True</Flat>
<ShowBorder type="boolean">True</ShowBorder>
<ControlRights type="identifier">crInherited</ControlRights>
</TCSMaskEdit>
</TPanel>
<TPanel name="FMainPanel" type="object">
<Left type="shortint">0</Left>
<Top type="smallint">237</Top>
<Width type="smallint">561</Width>
<Height type="smallint">210</Height>
<HelpContext type="longint">11182081</HelpContext>
<Align type="identifier">alClient</Align>
<BevelOuter type="identifier">bvNone</BevelOuter>
<TabOrder type="shortint">1</TabOrder>
</TPanel>
<TCSObject name="FLocationObject" type="object">
<ObjectType.Name type="string">ILocation</ObjectType.Name>
<ObjectType.GUID.GUID type="string">{73923621-A2F1-11D1-A0ED-
0140339316E9}</ObjectType.GUID.GUID>
<Binding type="identifier">bindLate</Binding>
<ObjectProperty.PropertyType.Name type="string">Unknown
</ObjectProperty.PropertyType.Name>
<ObjectProperty.PropertyType.DataType.DataType type="shortint">0
</ObjectProperty.PropertyType.DataType.DataType>
<ObjectProperty.PropertyType.DispatchID type="shortint">0
</ObjectProperty.PropertyType.DispatchID>
<ObjectProperty.PropertyType.AutoUpdate type="boolean">False
</ObjectProperty.PropertyType.AutoUpdate>
<Persist type="boolean">True</Persist>
<ProtectControls type="boolean">False</ProtectControls>
<OnAssign type="identifier">LocationObjectAssign</OnAssign>
<OnRelease type="identifier">LocationObjectRelease</OnRelease>
<Left type="smallint">517</Left>
<Top type="smallint">165</Top>
</TCSObject>
<TCSObject name="FProductObject" type="object">
<ObjectType.Name type="string">IProduct</ObjectType.Name>
<ObjectType.GUID.GUID type="string">{73923301-A2F1-11D1-A0ED-
0140339316E9}</ObjectType.GUID.GUID>
<Binding type="identifier">bindLate</Binding>
<ObjectProperty.PropertyType.Name type="string">Unknown
</ObjectProperty.PropertyType.Name>
<ObjectProperty.PropertyType.DataType.DataType type="shortint">0
</ObjectProperty.PropertyType.DataType.DataType>
<ObjectProperty.PropertyType.DispatchID type="shortint">0
</ObjectProperty.PropertyType.DispatchID>
<ObjectProperty.PropertyType.AutoUpdate type="boolean">False
</ObjectProperty.PropertyType.AutoUpdate>
<Persist type="boolean">True</Persist>
<ProtectControls type="boolean">False</ProtectControls>
<OnAssign type="identifier">ProductObjectAssign</OnAssign>
<OnRelease type="identifier">ProductObjectRelease</OnRelease>
<Left type="smallint">489</Left>
<Top type="smallint">165</Top>
</TCSObject>
</TIssueEditForm>