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>

等々。

ドキュメント全体を実行して、値に関係なく xsd:appinfo が指定されている要素のリストを返す C# コードを作成しようとしています。

私はしばらくこれに苦労しており、近づいているように感じますが、これまでのところ、適切な 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 の子を持つ注釈要素である場合にのみ true になります)。

于 2013-08-09T13:23:40.477 に答える