【问题标题】:c# XML Parsing separating innerxml from innertextc# XML Parsing将innerxml与innertext分开
【发布时间】:2012-01-03 12:37:05
【问题描述】:

我想要做的是理想情况下创建一个嵌套列表,基本上是一个 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();
        }

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

对不起,如果我不清楚,我想基本上把这个“抽象”起来,因为没有更好的词。

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

【问题讨论】:

  • “我永远不会知道节点的名称。”然后请提供一个示例,您希望如何检索数据。
  • 嗯,这就是我不知道该怎么做。如果我知道节点的名称,我可以使用 SelectSingleNode("ID").InnerText。我想要完成的是能够在不知道节点名称的情况下读取 XML 文件。
  • @Henk 关于重复 从来没有真正想过这个问题。我尝试这样做的原因是因为我正在处理的项目有 10 个 XML 文件,每个文件具有相同的基本结构,但不足以创建一个函数来处理所有事情。当试图处理 xml 文件中的微小更改需要编辑或添加数百行代码时,就会出现问题。因此,如果我有办法将整个内容加载到某种数组中,它会变得更容易。但现在我不确定如何进行。轻微的变化是添加了一个新节点。

标签: c# xml-parsing


【解决方案1】:

这是你追求的吗?

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();
        }
    }  

【讨论】:

  • 这正是我想要做的。不使用 Linq 有什么办法吗?
  • @Windex 是的,可以看到 'Joshua Mills' 的答案,但它太冗长了,所以请享受 Linq ;) stackoverflow.com/questions/847978/…
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2015-09-17
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    • 2020-06-09
    • 2011-01-16
    • 2017-02-04
    • 2019-04-26
    • 2014-07-18
    相关资源
    最近更新 更多