以xml格式从输入元素中提取信息

时间:2014-03-08 22:17:16

标签: c# xml wpf

以下是xml,

中输入文本标记的示例
<Root>
  <Items>
    <Content>
      <ContentControl>
        <Grid>
          <Image Tag="And" ToolTip="And"/>
          <TextBox Tag="Num1">12</TextBox>
          <TextBox Tag="Num2">15</TextBox>
        </Grid>
      </ContentControl>
    </Content>
    <Content>
      <ContentControl>
        <Grid>
          <Image Tag="Button Pressed" ToolTip="Button Pressed"/>
          <ComboBox IsDropDownOpen="False" Text="4" Tag="Num2">
            <ComboBoxItem>0</ComboBoxItem>
            <ComboBoxItem>1</ComboBoxItem>
            <ComboBoxItem>2</ComboBoxItem>
            <ComboBoxItem IsSelected="True">4</ComboBoxItem>
          </ComboBox>
        </Grid>
      </ContentControl>
    </Content>
  </Items>
</Root>

我需要使用C#单独读取输入到文本框和组合框中的输入。

如何确定哪个输入元素来自读取附加到它们的标签?以及在确定了要提取的输入数据后,如何分别从文本框和组合框输入中提取数据?

例如,在标记为“Num1”的文本框中,我想提取值12,并从我想要提取值4的所选项目的组合框中提取。

1 个答案:

答案 0 :(得分:1)

我不确定我是否理解你要实现的最终目标。

无论如何,这演示了如何实现&#34; 中提到的内容,例如&#34;这个问题的一节。这使用XDocumentXPath查询从标记的文本框中选择值12&#39; Num1&#39;和组合框所选项目的值4:

var doc = XDocument.Load("path_to_xml_file.xml");
var textBoxValue 
    = (string) doc.
                XPathSelectElement("/Root/Items/Content/ContentControl/Grid/TextBox[@Tag='Num1']");
var comboBoxValue 
    = (string)doc
                .XPathSelectElement("/Root/Items/Content/ContentControl/Grid/ComboBox[@Tag='Num2']/ComboBoxItem[@IsSelected='True']");

更新:

如果您在XML中的某处声明了默认名称空间,则默认名称空间中声明默认名称空间的XML元素及其所有后代都在默认名称空间中考虑。但另一方面,没有考虑前缀的XPath查询中的所有元素都没有命名空间。

为了弥合这种差异,你需要

  1. 添加指向默认命名空间url的前缀声明
  2. 将该前缀添加到XmlNamespaceManager
  3. 在默认命名空间
  4. 中选择元素时使用该前缀
  5. 并将XmlNamespaceManager作为XPathSelectElement方法
  6. 的第二个参数传递

    例如,假设从<Root>元素声明的默认命名空间:

    var namespaceManager = new XmlNamespaceManager(new NameTable());
    namespaceManager.AddNamespace("ns", "http://schemas.microsoft.com/winfx/2006/xaml/presentation");
    var textBoxValue
        = (string)doc.
                    XPathSelectElement(
                        "/ns:Root/ns:Items/ns:Content/ns:ContentControl/ns:Grid/ns:TextBox[@Tag='Num1']"
                        , namespaceManager);