0

次のようなxmlファイルがあります

<Name>AAA</Name>
<Age>23</Age>
<I1>
  <Element1>A</Element1>
  <Element2>B</Element2>
  <Element3>C</Element3>
<\I1>
<I2>
  <Element1>AA</Element1>
  <Element2>BB</Element2>
  <Element3>CC</Element3>
</I2>

C# 3.0 で xmlreader を使用して要素のすべての値を読み取っています。しかし、特定の開始タグと終了タグ内の値のみを読み取って変更する必要があります。上記のxmlファイルの場合、デフォルトで を読み取る必要があり、<Name>基本<Age>的に要素名である値「I1」または「I2」を返す関数があります。「I1」が返された場合は、 と の間の要素のみを読み取る<I1>必要</I1><I2>あり、その逆も同様です。したがって、コード構造は次のようになります(ロジックだけは構文エラーを無視してください)

/******function that returns element name I1 or I2*********/
string elementName = func(a,b);

xmlreader reader = reader.create("test.xml");
while(reader.read())
{
 switch(reader.nodetype)
 {
  case xmlnodetype.element:
   string nodeName = reader.name
   break;
 case xmlnodetype.text
   switch(nodeName)
   {
     /*************Read default name and age values*******/ 
     case "Name":
       string personName = reader.value
       break;
     case "Age":
       string personAge = reader.value;
       break;
    /*******End of reading default values**************/

    /*** read only elements between the value returned by function name above
        If function returns I1 then i need to read only values between <I1> </I1> else read </I2>    and </I2>**/   

    }
  }
}

ありがとう!

4

1 に答える 1

0

他にオフにするタグがないため、ファイルが最初から最後までこのようなものになると仮定します

<?xml version="1.0" encoding="utf-8" ?>
<RootElement>
    <UserInformation>
        <Name>AAA</Name>
        <Age>23</Age>
        <I1>    
            <Element1>A</Element1>
            <Element2>B</Element2>
            <Element3>C</Element3>
        <\I1>  
        <I2>    
            <Element1>AA</Element1>
            <Element2>BB</Element2>
            <Element3>CC</Element3>  
        </I2> 
    </UserInformation>
</RootElement>

そしてそれを呼び出す

System.IO.StreamReader sr = new System.IO.StreamReader("test.xml");
String xmlText = sr.ReadToEnd();
sr.Close();

List<UserInfo> finalList = readXMLDoc(xmlText);
if(finalList != null)
{
    //do something
}


    private List<UserInfo> readXMLDoc(String fileText)
    {
        //create a list of Strings to hold our user information
        List<UserInfo> userList = new List<UserInfo>();
        try
        {
            //create a XmlDocument Object
            XmlDocument xDoc = new XmlDocument();
            //load the text of the file into the XmlDocument Object
            xDoc.LoadXml(fileText);
            //Create a XmlNode object to hold the root node of the XmlDocument
            XmlNode rootNode = null;
            //get the root element in the xml document
            for (int i = 0; i < xDoc.ChildNodes.Count; i++)
            {
                //check to see if we hit the root element
                if (xDoc.ChildNodes[i].Name == "RootElement")
                {
                    //assign the root node
                    rootNode = xDoc.ChildNodes[i];
                    break;
                }
            }

            //Loop through each of the child nodes of the root node
            for (int j = 0; j < rootNode.ChildNodes.Count; j++)
            {
                //check for the UserInformation tag
                if (rootNode.ChildNodes[j].Name == "UserInformation")
                {
                    //assign the item node
                    XmlNode userNode = rootNode.ChildNodes[j];
                    //create userInfo object to hold results
                    UserInfo userInfo = new UserInfo();
                    //loop through each if the user tag's elements
                    foreach (XmlNode subNode in userNode.ChildNodes)
                    {
                        //check for the name tag
                        if (subNode.Name == "Name")
                        {
                            userInfo._name = subNode.InnerText;
                        }
                        //check for the age tag
                        if (subNode.Name == "Age")
                        {
                            userInfo._age = subNode.InnerText;
                        }
                        String tagToLookFor = "CallTheMethodThatReturnsTheCorrectTag";
                        //check for the tag
                        if (subNode.Name == tagToLookFor)
                        {
                            foreach (XmlNode elementNode in subNode.ChildNodes)
                            {
                                //check for the element1 tag
                                if (elementNode.Name == "Element1")
                                {
                                    userInfo._element1 = elementNode.InnerText;
                                }
                                //check for the element2 tag
                                if (elementNode.Name == "Element2")
                                {
                                    userInfo._element2 = elementNode.InnerText;
                                }
                                //check for the element3 tag
                                if (elementNode.Name == "Element3")
                                {
                                    userInfo._element3 = elementNode.InnerText;
                                }
                            }

                        }

                    }
                    //add the userInfo to the list
                    userList.Add(userInfo);
                }
            }
        }
        catch (Exception e)
        {
            System.Windows.Forms.MessageBox.Show(e.Message);
            return null;
        }
        //return the list
        return userList;
    }

    //struct to hold information
    struct UserInfo
    {
        public String _name;
        public String _age;
        public String _element1;
        public String _element2;
        public String _element3;
    }
于 2012-10-17T16:48:31.533 に答える