我正在使用某个没有裁员的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获取某个节点。
答案 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。特别是,它不会处理具有多个父“表”的单个子“表”。将“信息”元素作为人,头发和眼睛的孩子就是一个例子。