属性' xmlns'在XML文件元素中导致XmlDataProvider无法读取节点

时间:2015-08-25 16:05:32

标签: c# xml wpf xpath xmldataprovider

我正在尝试读取并解析xaml中的xml文件,并且遇到了障碍,因为xml文件中的一个元素(teststandfileheader)包含了&x; xmlns'如下:

<?xml version="1.0" encoding="UTF-8"?>
<teststandfileheader type="Globals" xmlns="http://www.ni.com/TestStand/14.0.0/PropertyObjectFile">
  Test
  <typelist />
  <Data classname="Obj">
    <subprops>
      <DEVBOARD classname="Bool">
        <value>false</value>
      </DEVBOARD>
      <DEVICES_PRESENT_HW classname="Bool">
        <value>true</value>
      </DEVICES_PRESENT_HW>
    </subprops>
  </Data>
</teststandfileheader>

当我将XPath设置为&#39; /&#39;时,我得到所有与所有元素相关联的文本。一旦我尝试将XPath设置为&#39; teststandfileheader&#39;之上或之下的某个位置。等级,我没有得到任何数据作为回报。

这是XAML:

<Window x:Class="DOTSDebugSelector.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:tb="http://www.hardcodet.net/taskbar"
        xmlns:local="clr-namespace:DOTSDebugSelector"
        Title="MainWindow" Height="350" Width="525" Visibility="Visible" WindowStyle="ToolWindow">
    <Window.Resources>
        <XmlDataProvider x:Key="TsStationGlobals" x:Name="TsStationGlobals" XPath="/teststandfileheader/Data/subprops" Source="C:\ProgramData\National Instruments\TestStand 2014 (32-bit)\Cfg\StationGlobalsdebug.ini" IsInitialLoadEnabled="True" IsAsynchronous="False">
        </XmlDataProvider>
        <local:TextToBoolConverter x:Key="BoolConverter"/>
        <ContextMenu x:Key="MyMenu">
            <CheckBox Content="USING DEV BOARD" Checked="DevBoard_Checked" IsChecked="{Binding Source={StaticResource TsStationGlobals}, Converter={StaticResource BoolConverter}, UpdateSourceTrigger=PropertyChanged, XPath=DEVBOARD/@value}"></CheckBox>
            <CheckBox Content="USING TEST HARDWARE" Checked="TestHardware_Checked" IsChecked="{Binding Source={StaticResource TsStationGlobals}, Converter={StaticResource BoolConverter}, UpdateSourceTrigger=PropertyChanged, XPath=DEVICES_PRESENT_HW/@value}"></CheckBox>
        </ContextMenu>
    </Window.Resources>
    <Grid>
        <tb:TaskbarIcon IconSource="DOTSIcon.ico" ToolTipText="Click to Setup DOTS Debug Mode" MenuActivation="RightClick"  ContextMenu="{StaticResource MyMenu}" />
        <TextBox HorizontalAlignment="Left" Height="22" Margin="222,124,0,0" TextWrapping="Wrap" Text="{Binding Source={StaticResource TsStationGlobals}, UpdateSourceTrigger=PropertyChanged, XPath=DEVBOARD}" VerticalAlignment="Top" Width="74"/>
        <TextBox HorizontalAlignment="Left" Height="22" Margin="222,151,0,0" TextWrapping="Wrap" Text="{Binding Source={StaticResource TsStationGlobals}, UpdateSourceTrigger=PropertyChanged, XPath=DEVICES_PRESENT_HW}" VerticalAlignment="Top" Width="74"/>
    </Grid>
</Window>

如果我将XML文件中的属性删除(甚至重命名)为&#39; xmlns&#39;一切都按预期工作。有关为何可能发生这种情况以及如何纠正的建议?另请注意,我不控制XML文件的格式,因此有问题的属性必须保留。

1 个答案:

答案 0 :(得分:1)

您需要在XPath表达式中使用您的命名空间 - 您当前的表达式不正确,因为没有具有该完全限定名称的元素。

例如,将命名空间映射到前缀p并将其包含在XPath中:

<XmlDataProvider XPath="/p:teststandfileheader/p:Data/p:subprops" Source="...">
    <XmlDataProvider.XmlNamespaceManager>
        <XmlNamespaceMappingCollection>
            <XmlNamespaceMapping 
               Uri="http://www.ni.com/TestStand/14.0.0/PropertyObjectFile" 
               Prefix="p" />
        </XmlNamespaceMappingCollection>
    </XmlDataProvider.XmlNamespaceManager>
</XmlDataProvider>