如何在C#中查找XSD根元素

时间:2009-12-21 02:53:37

标签: c# xml xsd

美好的一天。

据我所知。 XML文件中有一个根元素。

但是从XSD文件结构来看,获取根元素值并不容易。 有没有办法做到这一点?

(我不想在我的项目中使用硬代码来查找XSD根元素值。 我想找到“RootValueHere”的根元素

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="RootValueHere">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="DocumentInfo" minOccurs="1" maxOccurs="1" />
        <xsd:element ref="Prerequisite" minOccurs="1" maxOccurs="1" />
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  <!-- Element of DocumentInfo -->
  <xsd:element name="DocumentInfo">
    <xsd:complexType>
      <xsd:attribute name="Name" type="xsd:string" />
      <xsd:attribute name="Description" type="xsd:string" />
      <xsd:attribute name="Creator" type="xsd:string" />
      <xsd:attribute name="CreateTime" type="xsd:string" />
    </xsd:complexType>
  </xsd:element>
  <!-- Element of Prerequisite -->
  <xsd:element name="Prerequisite">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="Type" type="Prerequisite.Type.type" minOccurs="1" maxOccurs="1" />
        <xsd:element name="Miscellaneous" type="Prerequisite.Misc.type" minOccurs="0" maxOccurs="1" />
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

谢谢。

2 个答案:

答案 0 :(得分:5)

虽然单个文档只能包含一个根元素,但XSD实际上可以定义multiple valid root elements

如果您只是真的希望单个类型作为根元素有效,那么它应该是唯一被引用为<element>的类型。

例如,在上面的模式中,DocumentInfo和Prerequisite节点也是有效的根元素。要将架构限制为只有一个有效的根节点,请将DocumentInfo和Prerequisite元素替换为简单的complexType定义:

<xsd:complexType name="DocumentInfoType">
    ...
</xsd:complexType>
<xsd:complexType name="Prerequisite">
    ....
</xsd:complexType>

更新:要访问元素的名称,您只需要查看XmlElement上的Name属性:

XmlDocument doc = new XmlDocument();
doc.Load("D:\\schema.xsd");                      // Load the document from the root of an ASP.Net website

XmlElement schemaElement = doc.DocumentElement;  // The root element of the schema document is the <schema> element
string elementName = schemaElement.LocalName;    // This will print "schema"
foreach (XmlNode ele in schemaElement.ChildNodes)
{
    if (ele.LocalName == "element")
    {
        // This is a valid root node
        // Note that there will be *more than one* of these if you have multiple elements declare at the base level
    }
}

答案 1 :(得分:1)

我相信

XmlDocument myDocument = new XmlDocument("my.xml");
myDocument.DocumentElement(); //gets root document node