【问题标题】:How do I access xsd value using xpath如何使用 xpath 访问 xsd 值
【发布时间】:2020-01-02 18:44:51
【问题描述】:

我有以下 xsd 文件...

<?xml version="1.0" encoding="Windows-1252"?>
<xs:schema attributeFormDefault="unqualified"     elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="order">
<xs:complexType>
  <xs:sequence>
    <xs:element name="ordername" maxOccurs="1" minOccurs="1" type="xs:string" />

    <xs:element name="articles">
      <xs:complexType>
        <xs:sequence>
          <xs:element minOccurs="1" maxOccurs="unbounded" name="article">
            <xs:complexType>
              <xs:sequence>

                <xs:element name="Account" maxOccurs="1" minOccurs="1">
                        <xs:simpleType>
                        <xs:restriction base="xs:string">
                            <xs:pattern value="1|5|7|9"/>
                        </xs:restriction>
                        </xs:simpleType>
                </xs:element>                       
                <xs:element name="Vat" maxOccurs="1" minOccurs="1">
                        <xs:simpleType>
                        <xs:restriction base="xs:string">
                            <xs:pattern value="1|2|3"/>
                        </xs:restriction>
                        </xs:simpleType>
                </xs:element>                       

              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
      </xs:complexType>
    </xs:element>

  </xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

我正在尝试访问特定元素的所有允许模式。在这种情况下,我想找到“帐户”的允许模式,它应该给我“1|5|7|9”。理想情况下,我希望能够直接访问该值,就像这样......

            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(fileName);

            XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmlDoc.NameTable);
            nsmgr.AddNamespace("xs", "http://www.w3.org/2001/XMLSchema");

            var nodeToAccess = xmlDoc.DocumentElement.SelectSingleNode("order/articles/article/Account", nsmgr);

但这不起作用,谁能告诉我正确的方法吗?

【问题讨论】:

  • XPath 适用于节点,而不适用于节点的名称属性。所以你需要更多类似element[@name="order"]//element[@name="articles"] 等的东西。考虑阅读some documentation about XPath,也许可以找到一个在线实用程序,它将你的 XPath 与示例文档交互匹配,等等。

标签: c# xml xpath


【解决方案1】:

您可以为此使用 XPath:

    var nodeToAccess = xmlDoc.SelectSingleNode("//xs:element[@name='Account']/xs:simpleType/xs:restriction/xs:pattern", nsmgr);
    if (nodeToAccess != null)
    {
        Console.WriteLine(nodeToAccess.Attributes["value"].Value);
    }

【讨论】:

  • 但请注意,这是非常脆弱的。如果架构被重构并以不同的方式表达,例如使用全局类型声明而不是局部类型声明,那么您的代码将会中断。只有你可以判断这是否重要;但是以这种方式创建对模式内部细节的依赖并不是合理的工程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多