C# 如何得到4个变量的子项
我试图使用XPath从XML文档中获取一些变量问题是它们每次都不同(变量),但总有4个变量我只是不确定如何从XML文档中获取数据 我对XML或XPath不是很在行,但这是我到目前为止所想到的,我被卡住了,因为我不知道如何循环单元格以从中获取数据C# 如何得到4个变量的子项,c#,xml,xpath,C#,Xml,Xpath,我试图使用XPath从XML文档中获取一些变量问题是它们每次都不同(变量),但总有4个变量我只是不确定如何从XML文档中获取数据 我对XML或XPath不是很在行,但这是我到目前为止所想到的,我被卡住了,因为我不知道如何循环单元格以从中获取数据 for (int i = 0; i < 3; i++) { string sElementInfo = string.Empty;
for (int i = 0; i < 3; i++)
{
string sElementInfo = string.Empty;
var cell = xml.XPathSelectElement(
"oms:outputTree/oms:command[@text='Discriminant']/" +
"oms:heading[@text='Analysis 1']/" +
"oms:heading[@text='Classification Statistics']/" +
"oms:pivotTable[@text='Classification Function Coefficients']/" +
"oms:dimension[@text='(Variables)']",
nsManager);
if (cell != null)
{
sStatement1 = (string)cell.Attribute("varName");
}
}
for(int i=0;i<3;i++)
{
string sElementInfo=string.Empty;
var cell=xml.XPathSelectElement(
“oms:输出树/oms:命令[@text='Discriminant']/”+
“oms:标题[@text='Analysis 1']/”+
“oms:标题[@text='Classification Statistics']/”+
“oms:数据透视表[@text=”分类函数系数']/”+
“oms:维度[@text='(变量)””,
国家统计局局长);
如果(单元格!=null)
{
ssstatement1=(字符串)cell.Attribute(“varName”);
}
}
e4、e17和e22每次都会不同,因此我无法通过该名称找到它们,而且框中的“数字”每次也会不同,因此我也不确定如何获得它们。
我想如果我把整份文件都翻了一遍,我就不知道怎么去下一个牢房了。任何帮助都会很好!
多谢各位
如果这有帮助的话,这就是我通常使用xpath所做的,问题是我不知道varName将是什么,因此我可以从不同的XML文档中挑出其余的数据,但类似于:
var xml = XDocument.Load(@"c:/temp/descriptives_table.xml");
var nsManager = new XmlNamespaceManager(new NameTable());
nsManager.AddNamespace(
"oms",
"http://www.ibm.com/software/analytics/spss/xml/oms");
try
{
SqlDataReader sqlDR = sqlCom.ExecuteReader();
while (sqlDR.Read())
{
string sElementInfo = string.Empty;
var cell = xml.XPathSelectElement(
"oms:outputTree/oms:command[@text='Regression']/" +
"oms:heading[@text='uid = " + sqlDR.GetDouble(0) + ".00']/" +
"oms:pivotTable[@text='Coefficients']/" +
"oms:dimension/oms:category/oms:dimension/oms:category[@text='(Constant)']/" +
"oms:dimension/oms:group/oms:category/oms:cell",
nsManager);
if (cell != null)
{
var number = (string)cell.Attribute("number");
sElementInfo = sqlDR.GetDouble(0) + ", " + number + ", ";
//Console.WriteLine(sqlDR.GetDouble(0).ToString() + " (Constant) " + number);
for (int i = 1; i < 37; i++)
{
var xElement = xml.XPathSelectElement(
"oms:outputTree/oms:command[@text='Regression']/" +
"oms:heading[@text='uid = " + sqlDR.GetDouble(0) + ".00']/" +
"oms:pivotTable[@text='Coefficients']/" +
"oms:dimension/oms:category/oms:dimension/oms:category[@text='e" + i +"']/" +
"oms:dimension/oms:group/oms:category/oms:cell",
nsManager);
if (xElement != null)
{
var nElement = (string)xElement.Attribute("text");
sElementInfo = sElementInfo + nElement + ", ";
//Console.WriteLine(sqlDR.GetDouble(0).ToString() + " e" + i + " " + nElement);
//Console.WriteLine(" ");
}
}
//Console.WriteLine(sElementInfo.Remove(sElementInfo.Length-2));
var xml=XDocument.Load(@“c:/temp/descriptives_table.xml”);
var nsManager=newxmlnamespacemanager(newnametable());
nsManager.AddNamespace(
“oms”,
"http://www.ibm.com/software/analytics/spss/xml/oms");
尝试
{
SqlDataReader sqlDR=sqlCom.ExecuteReader();
while(sqlDR.Read())
{
string sElementInfo=string.Empty;
var cell=xml.XPathSelectElement(
“oms:outputTree/oms:command[@text='Regression']/”+
“oms:标题[@text='uid=“+sqlDR.GetDouble(0)+.00']/”+
“oms:数据透视表[@text='coverties']/”+
“oms:维度/oms:类别/oms:维度/oms:类别[@text=”(常量)]/”+
“oms:维度/oms:组/oms:类别/oms:单元”,
国家统计局局长);
如果(单元格!=null)
{
var number=(字符串)cell.Attribute(“number”);
sElementInfo=sqlDR.GetDouble(0)+“,“+number+”,”;
//Console.WriteLine(sqlDR.GetDouble(0.ToString()+“(常量)”+数字);
对于(int i=1;i<37;i++)
{
var xElement=xml.XPathSelectElement(
“oms:outputTree/oms:command[@text='Regression']/”+
“oms:标题[@text='uid=“+sqlDR.GetDouble(0)+.00']/”+
“oms:数据透视表[@text='coverties']/”+
“oms:维度/oms:类别/oms:维度/oms:类别[@text='e'+i+']/”+
“oms:维度/oms:组/oms:类别/oms:单元”,
国家统计局局长);
if(xElement!=null)
{
var neelement=(字符串)xElement.Attribute(“文本”);
sElementInfo=sElementInfo+neelement+“,”;
//Console.WriteLine(sqlDR.GetDouble(0.ToString()+“e”+i+“”+neElement);
//控制台。写线(“”);
}
}
//Console.WriteLine(sElementInfo.Remove(sElementInfo.Length-2));
您可以尝试使用System.Xml.Linq
var doc = XDocument.Load("XMLFile1.xml");
XNamespace ns = @"http://www.ibm.com/software/analytics/spss/xml/oms";
var pivotTables = doc.Descendants(ns + "pivotTable");
// identify the pivottable by the text "Classified Function Coefficients"
var theTable = pivotTables.Where(table => table.Attribute( "text").Value == "Classification Function Coefficients");
// first dimension
var dimension = theTable.Elements(ns + "dimension").First();
// first dimensions categories
var categories = dimension.Elements(ns + "category");
foreach (var category in categories)
{
// at index 5 there exists a category without varname and text="(Constant)"
// skip it
if(!category.Attributes().Any(attr => attr.Name == "varName"))
continue;
// here's the varname
var varName = category.Attribute( "varName").Value;
if (varName.StartsWith("("))
continue;
System.Diagnostics.Debug.WriteLine(varName);
var cells = category.Descendants(ns + "cell");
foreach (var cell in cells)
{
// here's the number of the cell
var number = cell.Attribute("number").Value;
System.Diagnostics.Debug.WriteLine(number);
}
}
输出:
- e9
- 0.163950172531
- 0.13063860362111
- 0.28542086095635
- e18
- 0.32758593355552
- 0.071751070799144
- 0.4532773907448
- e33
- 0.16067704682981
- 0.25422301797
- 0.01461475905339
- e34
- 0.3033365693718
- 0.12043800410649
- 0.58905116575338
编号即可。我需要varName,并对红色框中的部分进行编号。然后请使用XML创建一个粘贴或要点或类似内容,并链接到它。请务必更改“类别”听起来像是一个可能常见的元素名称,因此可能出现在xml中的其他位置。如果是这样的话,这将不起作用。但是,稍微修改一下可能就可以了。是的,这个xml文档中到处都是类别。@robert.westerlund没错。但是对于这种情况,我非常确定这已经足够了。@user1221399XML文件的正常行为。robert的意思是,category
将用于所示之外的另一个上下文中。它将挂起维度,但我认为这只是我玩它的问题。我将在几天后与您联系