避免XML文档中的冗余

时间:2010-03-24 13:06:37

标签: c# .net xml linq dataset

我正在使用某个没有裁员的XML

<person>
  <eye>
    <eye_info>
       <eye_color>
       blue
       </eye_color>
    </eye_info>
  </eye>
  <hair>
    <hair_info>
       <hair_color>
       blue
       </hair_color>
    </hair_info>
  </hair>
</person>

正如您所看到的,子标签眼睛颜色引用了眼睛的名称,因此无需避免冗余,在将XML加载到数据集后,我可以在一行中获得眼睛颜色:

dataset.ReadXml(path);
value = dataset.Tables("eye_info").Rows(0)("eye_color");

我确实意识到这不是最聪明的方式,而我现在所处的这种情况并非无法预料。

现在,让我们说我必须阅读这种格式的xml:

<person>
  <eye>
    <info>
       <color>
       blue
       </color>
    </info>
  </eye>
  <hair>
    <info>
       <color>
       blue
       </color>
    </info>
  </hair>
</person>

所以,如果我试着这样称呼它:

dataset.ReadXml(path);
value = dataset.Tables("info").Rows(0)("color");

会有一个冗余,因为我只能用一个上一级来用我以前的方法识别XML中的单个字段,并且'disambiguator'是上面的三个级别。

在上述所有(或至少几个)字段中,是否有一种实用的方法可以毫无错误地使用单个字段?

- [编辑] -

我提出了另一个问题,询问我如何使用linq check it out获取某个节点。

3 个答案:

答案 0 :(得分:4)

您还可以使用Linq to XML(System.Xml.Linq命名空间)并检索您的数据

string xml = @"<persons>
<person> 
  <eye> 
    <info> 
       <color>blue</color> 
    </info> 
  </eye> 
  <hair> 
    <info> 
       <color>blonde</color> 
    </info> 
  </hair> 
</person>
<person> 
  <eye> 
    <info> 
       <color>green</color> 
    </info> 
  </eye> 
  <hair> 
    <info> 
       <color>brown</color> 
    </info> 
  </hair> 
</person>
</persons>";

XDocument document = XDocument.Parse(xml);

var query = from person in document.Descendants("person")
            select new
            {
                EyeColor = person.Element("eye").Element("info").Element("color").Value,
                HairColor = person.Element("hair").Element("info").Element("color").Value
            };

foreach (var person in query)
    Console.WriteLine("{0}\t{1}", person.EyeColor, person.HairColor);

答案 1 :(得分:2)

有一个完整的标准围绕查询XML文档中的数据。该标准称为XPath,C#具有实现。开箱即用并不是最容易学习的东西,但它是从XML中提取数据并且非常值得学习的最佳技术之一。

Here就是一个例子。

编辑:我建议你弄清楚LINQ to XML,因为它更强大但是如果你仍然需要XPath那么你的具体问题就像是(我在这台计算机上没有VS,所以我无法验证这一点)...

XPathDocument doc = new XPathDocument(new StringReader(xmlString));
XPathNavigator nav = doc.CreateNavigator();

// Compile a standard XPath expression
XPathExpression expr = nav.Compile("/person/eye/eye_info/eye_color");
expr = nav.Compile("/catalog/cd/price");
XPathNodeIterator iterator = nav.Select(expr);

// Iterate on the node set
while (iterator.MoveNext())
{
   XPathNavigator nav2 = iterator.Current.Clone();
   Console.WriteLine(nav2.Value);
}

答案 2 :(得分:0)

请记住,DataSet类只能理解可以转换为关系数据库形式的XML。特别是,它不会处理具有多个父“表”的单个子“表”。将“信息”元素作为人,头发和眼睛的孩子就是一个例子。