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;
}
誰かが私が間違っている場所を提案できますか (そして、どのように正しく行くか!)?