我有一个 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;
}
有人可以建议我哪里出错(以及如何正确!)?