求助关于xml SelectSingleNode取值的问题

慕容I紫英 2012-03-08 03:34:50
xml文件
<?xml version="1.0" encoding="utf-8"?>
<Report xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner" xmlns="http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition">
<DataSources>
<DataSource Name="ds">
<ConnectionProperties>
<DataProvider>System.Data.DataSet</DataProvider>
<ConnectString>/* Local Connection */</ConnectString>
</ConnectionProperties>
<rd:DataSourceID>4601aaa3-4033-415b-b89f-d06d9bb1c2a4</rd:DataSourceID>
</DataSource>
</DataSources>
<Body>
<ReportItems>
<Textbox Name="Textbox1">
<CanGrow>true</CanGrow>
<KeepTogether>true</KeepTogether>
<Paragraphs>
<Paragraph>
<TextRuns>
<TextRun>
<Value>M型及二维</Value>
<Style>
<FontFamily>宋体</FontFamily>
</Style>
</TextRun>
</TextRuns>
<Style>
<TextAlign>Center</TextAlign>
</Style>
</Paragraph>
</Paragraphs>
<rd:DefaultName>Textbox1</rd:DefaultName>
<Top>0.03175cm</Top>
<Left>0.03306cm</Left>
<Height>0.6cm</Height>
<Width>10.22459cm</Width>
<Style>
<Border>
<Style>Solid</Style>
</Border>
<PaddingLeft>2pt</PaddingLeft>
<PaddingRight>2pt</PaddingRight>
<PaddingTop>2pt</PaddingTop>
<PaddingBottom>2pt</PaddingBottom>
</Style>
</Textbox>
<Textbox Name="Textbox2">
<CanGrow>true</CanGrow>
<KeepTogether>true</KeepTogether>
<Paragraphs>
<Paragraph>
<TextRuns>
<TextRun>
<Value>主

脉</Value>
<Style>
<FontFamily>宋体</FontFamily>
</Style>
</TextRun>
</TextRuns>
<Style>
<TextAlign>Center</TextAlign>
</Style>
</Paragraph>
</Paragraphs>
<rd:DefaultName>Textbox1</rd:DefaultName>
<Top>0.63175cm</Top>
<Left>0.03306cm</Left>
<Height>1.8cm</Height>
<Width>0.96542cm</Width>
<ZIndex>1</ZIndex>
<Style>
<Border>
<Style>Solid</Style>
</Border>
<PaddingLeft>2pt</PaddingLeft>
<PaddingRight>2pt</PaddingRight>
<PaddingTop>2pt</PaddingTop>
<PaddingBottom>2pt</PaddingBottom>
</Style>
</Textbox>
</ReportItems>
<Height>4.08251in</Height>
<Style />
</Body>
<Width>8.10512in</Width>
<Page>
<PageHeight>29.7cm</PageHeight>
<PageWidth>21cm</PageWidth>
<LeftMargin>2cm</LeftMargin>
<RightMargin>2cm</RightMargin>
<TopMargin>2cm</TopMargin>
<BottomMargin>2cm</BottomMargin>
<ColumnSpacing>0.13cm</ColumnSpacing>
<Style />
</Page>
<rd:ReportID>a811afcc-eafd-4665-86e4-00f39a37878a</rd:ReportID>
<rd:ReportUnitType>Cm</rd:ReportUnitType>
</Report>

代码

XmlNamespaceManager xnm = new XmlNamespaceManager(xml.NameTable);
xnm.AddNamespace("rd", "http://schemas.microsoft.com/SQLServer/reporting/reportdesigner");
xnm.AddNamespace("default", "http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition");
xnm.PushScope();
XmlNodeList xnl = xml.SelectNodes(
"//default:Report//default:Body//default:ReportItems//default:Textbox", xnm);
Textbox[] tb = new Textbox[xnl.Count];
for (int i = 0; i < tb.Length; i++)
{
XmlNode x = xnl[i].SelectSingleNode("//default:Paragraphs//default:Paragraph//default:TextRuns//default:Value", xnm);
Console.WriteLine(xnl[i].InnerText+x.InnerXml);
}



xnl[i].SelectSingleNode 出来的每次都是第一个  弄了好长时间也没弄明白为什么。
...全文
216 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
慕容I紫英 2012-03-08
  • 打赏
  • 举报
回复

XmlNamespaceManager xnm = new XmlNamespaceManager(xml.NameTable);
xnm.AddNamespace("rd", "http://schemas.microsoft.com/SQLServer/reporting/reportdesigner");
xnm.AddNamespace("default", "http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition");
xnm.PushScope();
XmlNodeList xnl = xml.SelectNodes("//default:Report//default:Body//default:ReportItems//default:Textbox", xnm);
for (int i = 0; i < tb.Length; i++)
{
XmlNode x = xnl[i].SelectSingleNode(
"//default:Textbox[Name='"+xnl[i].Attributes["Name"].Value+"']//default:Paragraphs//default:Paragraph//default:TextRuns//default:Value", xnm);
Console.WriteLine(xnl[i].InnerText+x.InnerXml);
}

需要明确节点的名称//default:Textbox[Name='"+xnl[i].Attributes["Name"].Value+"']



慕容I紫英 2012-03-08
  • 打赏
  • 举报
回复

XmlNodeList xnl = xml.SelectNodes(
"//Report//Body//ReportItems//Textbox", xnm);
Textbox[] tb = new Textbox[xnl.Count];
for (int i = 0; i < tb.Length; i++)
{
XmlNode x = xnl[i].SelectSingleNode("//Top", xnm);
Console.WriteLine(xnl[i].InnerText+x.InnerXml);
}

这个就是正确答案
增加命名空间后就是我出现的那种状况了。
风之影子 2012-03-08
  • 打赏
  • 举报
回复
http://wenku.baidu.com/view/90503b1cc281e53a5802ff06.html


打开看看
慕容I紫英 2012-03-08
  • 打赏
  • 举报
回复
不用XmlNamespaceManager 的时候是正确的。。
慕容I紫英 2012-03-08
  • 打赏
  • 举报
回复
简单点
<?xml version="1.0" encoding="utf-8"?>
<Report xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner" xmlns="http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition">
<Body>
<ReportItems>
<Textbox Name="Textbox1">
<Value>1111111111111</Value>
</Textbox>
<Textbox Name="Textbox2">
<Value>2222222222222</Value>
</Textbox>
<Textbox Name="Textbox3">
<Value>3333333333333</Value>
</Textbox>
</ReportItems>
</Body>
</Report>

使用上面的返回时
11111111111111111111111111
22222222222221111111111111
33333333333331111111111111

我希望的返回值是
111111111111111
222222222222222
333333333333333
慕容I紫英 2012-03-08
  • 打赏
  • 举报
回复
xnl[0]
<Textbox Name="Textbox1">
<CanGrow>true</CanGrow>
<KeepTogether>true</KeepTogether>
<Paragraphs>
<Paragraph>
<TextRuns>
<TextRun>
<Value>M型及二维</Value>
<Style>
<FontFamily>宋体</FontFamily>
</Style>
</TextRun>
</TextRuns>
<Style>
<TextAlign>Center</TextAlign>
</Style>
</Paragraph>
</Paragraphs>
<rd:DefaultName>Textbox1</rd:DefaultName>
<Top>0.03175cm</Top>
<Left>0.03306cm</Left>
<Height>0.6cm</Height>
<Width>10.22459cm</Width>
<Style>
<Border>
<Style>Solid</Style>
</Border>
<PaddingLeft>2pt</PaddingLeft>
<PaddingRight>2pt</PaddingRight>
<PaddingTop>2pt</PaddingTop>
<PaddingBottom>2pt</PaddingBottom>
</Style>
</Textbox>

他的第一个 <Value>M型及二维</Value>
 

xnl[1]
<Textbox Name="Textbox2">
<CanGrow>true</CanGrow>
<KeepTogether>true</KeepTogether>
<Paragraphs>
<Paragraph>
<TextRuns>
<TextRun>
<Value>主

脉</Value>
<Style>
<FontFamily>宋体</FontFamily>
</Style>
</TextRun>
</TextRuns>
<Style>
<TextAlign>Center</TextAlign>
</Style>
</Paragraph>
</Paragraphs>
<rd:DefaultName>Textbox1</rd:DefaultName>
<Top>0.63175cm</Top>
<Left>0.03306cm</Left>
<Height>1.8cm</Height>
<Width>0.96542cm</Width>
<ZIndex>1</ZIndex>
<Style>
<Border>
<Style>Solid</Style>
</Border>
<PaddingLeft>2pt</PaddingLeft>
<PaddingRight>2pt</PaddingRight>
<PaddingTop>2pt</PaddingTop>
<PaddingBottom>2pt</PaddingBottom>
</Style>
</Textbox>
应该是: <Value>主

脉</Value>

为什么返回的确实xnl[0]的呢。
风之影子 2012-03-08
  • 打赏
  • 举报
回复
XMLNode.SelectSingleNode 方法
获取一个 Microsoft.Office.Interop.Word.XMLNode 对象,该对象表示 Microsoft.Office.Tools.Word.XMLNode 控件中与 XPath 参数匹配的第一个子节点。


SelectSingleNode此方法返回提第一个子节点(第一个)
慕容I紫英 2012-03-08
  • 打赏
  • 举报
回复
SelectNodes 返回的是所有"//default:Report//default:Body//default:ReportItems//default:Textbox“
的值
慕容I紫英 2012-03-08
  • 打赏
  • 举报
回复
我想取得 xnl[i] 的值
但是使用SelectSingleNode返回的每次都是xnl[0]的值
因为第一次使用带命名空间的xml所以不知道哪里操作的不正确
风之影子 2012-03-08
  • 打赏
  • 举报
回复
遍历期结点期间,设置断点进行跟踪先确定问题,你再试一下。

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧