1

私は次のようにXML構成ファイルのXSDを作成しました。

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:t="http://www.foo.com/schemas/datatransfer"
           targetNamespace="http://www.foo.com/schemas/datatransfer"
           attributeFormDefault="unqualified" elementFormDefault="qualified">
  <xs:element name="transferGroups">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="transferGroup" maxOccurs="unbounded">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="connectionString" type="xs:string" />
              <xs:choice minOccurs="1" maxOccurs="1">
                <xs:element name="script" minOccurs="0" maxOccurs="1">
                  <xs:complexType>
                    <xs:attribute name="path" type="xs:string" use="required" />
                    <xs:attribute name="fileName" type="xs:string" use="required" />
                    <xs:attribute name="useCompression" type="xs:boolean" use="required" />
                  </xs:complexType>
                </xs:element>
                <xs:element name="table" minOccurs="0" maxOccurs="1">
                  <xs:complexType>
                    <xs:attribute name="name" type="xs:string" use="required" />
                    <xs:attribute name="fileName" type="xs:string" use="required" />
                    <xs:attribute name="useCompression" type="xs:boolean" use="required" />
                  </xs:complexType>
                </xs:element>
                <xs:element name="tables" minOccurs="0" maxOccurs="1">
                  <xs:complexType>
                    <xs:sequence>
                      <xs:element name="table" maxOccurs="unbounded" minOccurs="1">
                        <xs:complexType>
                          <xs:attribute name="name" type="xs:string" use="required" />
                          <xs:attribute name="fileName" type="xs:string" use="required" />
                          <xs:attribute name="useCompression" type="xs:boolean" use="required" />
                        </xs:complexType>
                      </xs:element>
                    </xs:sequence>
                  </xs:complexType>
                </xs:element>
              </xs:choice>
              <xs:element name="format">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="addHeaderRow">
                      <xs:complexType>
                        <xs:attribute name="value" type="xs:boolean" use="required" />
                      </xs:complexType>
                    </xs:element>
                    <xs:element name="columnsDelimitedBy">
                      <xs:complexType>
                        <xs:attribute name="value" type="xs:string" use="required" />
                      </xs:complexType>
                    </xs:element>
                    <xs:element name="rowsDelimitedBy">
                      <xs:complexType>
                        <xs:attribute name="value" type="xs:string" use="required" />
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="transferSite">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="protocol">
                      <xs:complexType>
                        <xs:attribute name="value" type="xs:string" use="required" />
                        <xs:attribute name="address" type="xs:string" use="required" />
                        <xs:attribute name="port" type="xs:unsignedByte" use="required" />
                      </xs:complexType>
                    </xs:element>
                    <xs:element name="credentials">
                      <xs:complexType>
                        <xs:attribute name="userName" type="xs:string" use="required" />
                        <xs:attribute name="password" type="xs:string" use="required" />
                      </xs:complexType>
                    </xs:element>
                    <xs:element name="destinationFolder">
                      <xs:complexType>
                        <xs:attribute name="value" type="xs:string" use="required" />
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
            <xs:attribute name="useCompression" type="xs:boolean" use="required" />
            <xs:attribute name="fileName" type="xs:string" use="optional" />
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Visual Studioで次のように設計したXMLファイルからスキーマを生成(次に変更)しました。

<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<transferGroups>
  <transferGroup useCompression="false" >
    <connectionString>DSN=MyDSN;uid=foo;password=bar;</connectionString>
    <tables>
      <table name="dbo.Foo1" fileName="E:\Files\Foo1_{0:yyyyMMdd}.gz" useCompression="true" />
      <table name="pub.Foo2" fileName="E:\Files\Foo2_{0:yyyyMMdd}.gz" useCompression="true" />
    </tables>
    <format>
      <addHeaderRow value="true"/>
      <columnsDelimitedBy value="|" />
      <rowsDelimitedBy value="\r\n" />
    </format>
    <transferSite>
      <protocol value="FTP" address="localhost" port="21" />
      <credentials userName="anonymous" password="test@myserver.com" />
      <destinationFolder value="/" />
    </transferSite>
  </transferGroup>
</transferGroups>

実際には、次のような構成ファイルを作成しました。

<transferGroups xmlns="http://www.foo.com/schemas/datatransfer">
  <transferGroup useCompression="false" >
    <connectionString>some connection string</connectionString>
    <tables>
      <table name="tableName1" fileName="tableName1_{0:yyyyMMdd}.gz" useCompression="true" />
      <table name="tableName2" fileName="tableName2_{0:yyyyMMdd}.gz" useCompression="true" />
    </tables>
    <format>
      <addHeaderRow value="true"/>
      <columnsDelimitedBy value="|" />
      <rowsDelimitedBy value="\r\n" />
    </format>
    <transferSite>
      <protocol value="FTP" address="ftp.someplace.com" port="21" />
      <credentials userName="foo" password="bar" />
      <destinationFolder value="subFolder1" />
    </transferSite>
  </transferGroup>
</transferGroups>

ただし、名前空間/スキーマを指定すると、のファイルを解析する方法が変わることに気づきませんでしたXmlDocument。たとえば、スキーマを指定しなかった場合、このコードセグメントはXmlNodeList1つをキャプチャしますが、スキーマを指定すると、一致するノードはありません。XmlNode

var xmlDoc = new XmlDocument();
xmlDoc.LoadXml(myXml);
var transferGroupNodes = xmlDoc.SelectNodes("//transferGroups/transferGroup")
    .OfType<XmlNode>();

transferGroupこの状況で解析するノードをどのように収集しますか?これを行う方法を示す適切な例をオンラインで見つけることができません。

4

1 に答える 1

1

スキーマは問題とは何の関係もありません。名前の付いたノードがあるため、それに応じてXPathを変更する必要があります。Jon Skeetが指摘しているように、LINQ to XMLを使用すると使いやすくなりますが、それでも正しい名前のノードを選択する必要があります。

XPathで名前空間を使用する問題は、複数回取り上げられています-FAQの回答から始めてください-C#でのデフォルトの名前空間でのXpathの使用

XPathで名前空間を無視する不正な方法:"//*[ local-name() = 'justName']"

于 2012-04-17T19:03:40.430 に答える