1

XML構成から特定の値を取得しようとしています。以下の例を参照してください。

<?xml version="1.0" encoding="utf-8"?>
<ExcelConfig>
    <ExcelDocument name="Customer" type="flat">
        <IdentityColumn>
            <Column name="Id" />
        </IdentityColumn>
        <Validate>
            <Column name="Name" mandatory="true" />
            <Column name="FirstName" mandatory="true" />
            <OrColumns mandatory="true">
                <Column name="PostalCode" mandatory="false" />
                <Column name="PostalCode2" mandatory="false" />
            </OrColumns>
        </Validate>
    </ExcelDocument>
    <ExcelDocument name="Company" type="flat">
        <IdentityColumn>
            <Column name="Id" />
        </IdentityColumn>
        <Validate>
            <Column name="Name" mandatory="true" />
            <Column name="FirstName" mandatory="true" />
            <OrColumns mandatory="true">
                <Column name="PostalCode" mandatory="false" />
                <Column name="PostalCode2" mandatory="false" />
            </OrColumns>
        </Validate>
    </ExcelDocument>
    <ExcelDocument name="SomeOtherType" type="block">
        <IdentityBlock>
            <Column name="Period" col="A" />
            <Column name="Period2" col="B" />
        </IdentityBlock>
        <Validate>
            <Column name="Name" mandatory="true" />
            <Column name="FirstName" mandatory="true" />
        </Validate>
    </ExcelDocument>
</ExcelConfig>

次のコードを使用して、Excel ファイルから情報を取得します。「ValidationConfiguration」は、以前の構成の文字列です。

            //Get Different NodeTypes of Excel documents
            List<XPathNavigator> types = XmlHelper.GetNodeTypes(validationConfiguration, "/ExcelConfig/ExcelDocument");
            List<XPathNavigator> flatTypes = XmlHelper.GetNodeTypes(validationConfiguration,
                                                                     "//ExcelConfig/ExcelDocument[@type='flat']");
            List<XPathNavigator> blockTypes = XmlHelper.GetNodeTypes(validationConfiguration,
                                                                     "//ExcelConfig/ExcelDocument[@type='block']");


            //First we check if the file is from the flat type and get the IdentityColumns
            List<XPathNavigator> identityColumnsNode = XmlHelper.GetNodeTypes(validationConfiguration, "//ExcelConfig/ExcelDocument[@type='flat']/IdentityColumn");

以下の XmlHelper クラスを見つけることができます。

 public static class XmlHelper
    {
        public static List<XPathNavigator> GetNodeTypes(string xmlConfiguration,string xPath)
        {
            XPathDocument doc = new XPathDocument(new StringReader(xmlConfiguration));
            XPathNavigator nav = doc.CreateNavigator();

            XPathExpression expr = nav.Compile(xPath);
            List<XPathNavigator> elements = new List<XPathNavigator>();

            foreach (XPathNavigator node in nav.Select(expr))
            {
                elements.Add(node);   
            }

            return elements;
        }

        public static List<string> GetIdentityColumnNames(List<XPathNavigator> xPathNavigators)
        {
            List<string> identityColumns = new List<string>();

            foreach (XPathNavigator xPathNavigator in xPathNavigators)
            {
                foreach (XPathNavigator test in xPathNavigator.Select("//Column"))
                {
                    identityColumns.Add(test.GetAttribute("name", ""));
                }
            }

            return identityColumns;
        }
    }

今、私は次のことをしたいです。私はidentityColumnsNodesを選択しました(フラットタイプのExcelドキュメントからのIdentityColumnが含まれています)。列を型指定する al の i get。しかし、それを試みると、ファイル全体からすべての列が返されます。彼は私が使用するノードのアイテムだけではありません。

 foreach (XPathNavigator identityColumNode in identityColumnsNode)
                        {
                            List<string> identityColumns = XmlHelper.GetIdentityColumnNames(identityColumnsNode);          
                        }

2番目の問題/やりたいこと->特定のファイルから正しい検証ノードを選択する最良の方法。identityColumns (戻ってきて、HeaderRow セルのリストがあれば、それがどのファイルかがわかります。しかし、その検証ノードを選択するにはどうすればよいですか?

それとも、これを行うためのより良い方法はありますか?

4

0 に答える 0