c#XML解析将innerxml与innertext分开

时间:2012-01-03 12:37:06

标签: c# xml-parsing

我想要做的是理想地创建嵌套List基本上是2d列表,或者如果对于此任务更好,则创建2D数组,如果没有明确选择节点,则可以如下ID => 1 Name => Hickory工作。

我可以使用SelectNode(Woods / Wood),然后执行类似node["ID"].InnerText的操作,但这需要我知道节点名称是什么。

假设即使有36个节点而不是7个节点,这将读取wood.xml并且我永远不会知道节点的名称。我尝试使用outerxml / innerxml,但这给了我太多信息。

 XmlDocument doc = new XmlDocument();
        doc.Load("wood.xml");

        //Here is wood.xml
        /*<Woods><Wood><ID>1</ID><Name>Hickory</Name><Weight>3</Weight><Thickness>4</Thickness><Density>5</Density><Purity>6</Purity><Age>7</Age></Wood><Wood><ID>2</ID><Name>Soft Maple</Name><Weight>3</Weight><Thickness>4</Thickness><Density>5</Density><Purity>6</Purity><Age>7</Age></Wood><Wood><ID>3</ID><Name>Red Oak</Name><Weight>3</Weight><Thickness>4</Thickness><Density>5</Density><Purity>6</Purity><Age>7</Age></Wood></Woods>*/


        XmlNode root = doc.FirstChild;

        //Display the contents of the child nodes.
        if (root.HasChildNodes)
        {
            for (int i=0; i<root.ChildNodes.Count; i++)
            {
                Console.WriteLine(root.ChildNodes[i].InnerXml);
                Console.WriteLine();
            }

            Console.ReadKey();
        }

这样我就可以基本上创建一个木头“缓冲区”,如果你愿意,我可以在其他地方访问这些值。

对不起,如果我不清楚我想基本上因为缺乏一个更好的词而使这个“抽象”。

因此,如果我有一天将“权重”的名称更改为“HowHeavy”,或者如果我要添加一个额外的元素“NumberOfBranches”,我就不必对xml文件的结构进行硬编码。

2 个答案:

答案 0 :(得分:2)

这是你追求的吗?

class Program
    {   
        static void Main(string[] args)
        {
          string xml = @"<Woods><Wood><ID>1</ID><Name>Hickory</Name><Weight>3</Weight><Thickness>4</Thickness><Density>5</Density><Purity>6</Purity><Age>7</Age></Wood><Wood><ID>2</ID><Name>Soft Maple</Name><Weight>3</Weight><Thickness>4</Thickness><Density>5</Density><Purity>6</Purity><Age>7</Age></Wood><Wood><ID>3</ID><Name>Red Oak</Name><Weight>3</Weight><Thickness>4</Thickness><Density>5</Density><Purity>6</Purity><Age>7</Age></Wood></Woods>";

           XDocument doc = XDocument.Parse(xml);
           //Get your wood nodes and values in a list 
           List<Tuple<string,string>> list = doc.Descendants().Select(a=> new Tuple<string,string>(a.Name.LocalName,a.Value)).ToList();

           // display the list
           list.All(a => { Console.WriteLine(string.Format("Node name {0} , Node Value {1}", a.Item1, a.Item2)); return true; });
           Console.Read();
        }
    }  

答案 1 :(得分:1)

您可以使用xmlDocument.SelectNodes("//child::node()")