0

我有一个 XSD 文档,我需要选择与某个布局匹配的所有节点。

这是 XSD 的一个片段:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="MachineParameters">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="stMachineParameters"
         minOccurs="1"
         maxOccurs="1">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="CPSPEED"
                     minOccurs="1"
             maxOccurs="1">
                  <xsd:annotation>
        <xsd:documentation>CPSPEEDDesc</xsd:documentation>
        <xsd:appinfo>false</xsd:appinfo>
          </xsd:annotation>
          <xsd:simpleType>
                    <xsd:restriction base = "xsd:decimal">
                    </xsd:restriction>
                  </xsd:simpleType>
                </xsd:element>  
                <xsd:element name="STVARZPARAMS"
                     minOccurs="1"
                             maxOccurs="1">
                  <xsd:complexType>
                    <xsd:sequence>
                      <xsd:element name="VARIABLEZFASTVELOCITY">
                        <xsd:annotation>
                          <xsd:documentation>VARIABLEZFASTVELOCITYDesc</xsd:documentation>
                          <xsd:appinfo>false</xsd:appinfo>
                        </xsd:annotation>
                        <xsd:simpleType>
                          <xsd:restriction base = "xsd:decimal">
                            <xsd:minInclusive value="0" />
                            <xsd:maxInclusive value="1" />
                          </xsd:restriction>
                        </xsd:simpleType>
                      </xsd:element>

等等。

我正在尝试编写一些 C# 代码来运行我的整个文档,并返回一个包含指定 xsd:appinfo 的任何元素的列表,无论其值如何。

我已经为此苦苦挣扎了一段时间,感觉自己已经很接近了,但是到目前为止,我还没有找到正确的 Xpath 查询(我以前没有使用过)。

这是C#:

elementInfo = new Dictionary<string, DictionaryInfo>();

XmlNodeList nodeList;
XmlNode root = xmlDocSchema.DocumentElement;


try
{
    // the presence of an annotation/appinfo for the element is being used to identify it as a value element
    XmlNamespaceManager xmlNamespaceManager = new XmlNamespaceManager(xmlDocSchema.NameTable);
    xmlNamespaceManager.AddNamespace("xsd", "http://www.w3.org/2001/XMLSchema");
    nodeList = root.SelectNodes("/*/element[/annotation/appinfo='false' or /annotation/appinfo='true']", xmlNamespaceManager);
}
catch (System.Xml.XPath.XPathException ex)
{
    MessageBox.Show(string.Format("Xpath exception: {0}", ex.Message));
    nodeList = null;
}
catch (Exception ex)
{
    MessageBox.Show(string.Format("General exception: {0}", ex.Message));
    nodeList = null;
}

有人可以建议我哪里出错(以及如何正确!)?

4

1 回答 1

1

我想你想用

"//xsd:element[xsd:annotation/xsd:appinfo]"

作为你的xpath。您使用的内容有一些更改:

  • //element是用于选择文档中任何级别的元素的语法。/*/element仅选择作为根节点的子节点的元素。

  • 您需要在 XPath 中使用该名称空间的每个元素上使用名称空间前缀。

  • 如果您对谓词不感兴趣,则无需检查谓词的值;只需指定元素名称(或路径)即可检查是否存在。

  • 以谓词开头/很少是您想要的。它忽略当前上下文,并尝试匹配从文档根开始的谓词(在您的情况下,谓词[/annotation/appinfo]仅在根节点是注释元素且具有 appinfo 子节点时才为真。)

于 2013-08-09T13:23:40.477 回答