C# 如何从Web服务获取输入
我正在尝试编写一个程序,该程序将接收来自web服务的输入,并选择与订单ID一起提供的正确信息。我使用xPath进行此操作,因为这是必需的。例如,如果我在运行程序时在OrderID下输入1,它应该提取该订单的总成本并显示它。我知道我的代码肯定有问题,因为我是新手,当我无法控制所使用的变量时,我不知道如何实际获取输入。任何帮助都将不胜感激,谢谢 这是我的密码:C# 如何从Web服务获取输入,c#,xml,xpath,xpathnavigator,C#,Xml,Xpath,Xpathnavigator,我正在尝试编写一个程序,该程序将接收来自web服务的输入,并选择与订单ID一起提供的正确信息。我使用xPath进行此操作,因为这是必需的。例如,如果我在运行程序时在OrderID下输入1,它应该提取该订单的总成本并显示它。我知道我的代码肯定有问题,因为我是新手,当我无法控制所使用的变量时,我不知道如何实际获取输入。任何帮助都将不胜感激,谢谢 这是我的密码: [WebMethod] public int GetTotalCostForAnOrder(int OrderID) { XPath
[WebMethod]
public int GetTotalCostForAnOrder(int OrderID)
{
XPathNavigator nav;
XPathDocument docNav;
XPathNodeIterator NodeIter;
String rootPath = Server.MapPath("~");
string strFilename = rootPath + "\\OrderInfoLab3.xml";
docNav = new XPathDocument(strFilename);
// Create a navigator to query with XPath.
nav = docNav.CreateNavigator();
String searchString = "sum(OrderFeed/Order/Items/Item/TotalCost)";
// you need to determine the proper XPath statement
// Select the node and place the results in an iterator.
NodeIter = nav.Select(searchString);
while (NodeIter.MoveNext())
{
NodeIter.Current.Select("OrderID");
}
var totalOrder = nav.Compile(searchString);
return Convert.ToInt32(nav.Evaluate(totalOrder));
}
这是我的XML文件:
<Order id="1">
<BillingInformation>
<Name>Bruce Ganek</Name>
<Address>99 Main Street</Address>
<City>Cranston</City>
<State>RI</State>
<ZipCode>02910</ZipCode>
</BillingInformation>
<ShippingInformation>
<Name>Governor Chafee</Name>
<Address>82 Smith St # 115</Address>
<City>Providence</City>
<State>RI</State>
<ZipCode>02903-1121</ZipCode>
</ShippingInformation>
<Items>
<Item>
<PartNo>JETSWEATER</PartNo>
<Description>N.Y. Jets Sweatshirt</Description>
<UnitPrice>10.50</UnitPrice>
<Quantity>2</Quantity>
<TotalCost>21.00</TotalCost>
<CustomerOptions>
<Size>M</Size>
<Color>Green</Color>
</CustomerOptions>
</Item>
<Item>
<PartNo>JETSWEATER</PartNo>
<Description>N.Y. Jets Sweatshirt</Description>
<UnitPrice>7.50</UnitPrice>
<Quantity>3</Quantity>
<TotalCost>22.50</TotalCost>
<CustomerOptions>
<Size>S</Size>
<Color>White</Color>
</CustomerOptions>
</Item>
<Item>
<PartNo>JETSFLASHLIGHT</PartNo>
<Description>N.Y. Jets Flashlight</Description>
<UnitPrice>5.00</UnitPrice>
<Quantity>1</Quantity>
<TotalCost>5.00</TotalCost>
<CustomerOptions/>
</Item>
</Items>
</Order>
以下行似乎不正确:
String searchString = "sum(OrderFeed/Order/Items/Item/TotalCost)";
这应该是选择节点的XPath表达式,但XML中没有OrderFeed
节点-根节点是Order
作为节点集合,这将带来更好的结果:
String searchString = "/Order/Items/Item/TotalCost";
您应该使用LINQ2XML
public decimal GetTotalCostForAnOrder(int OrderID)
{
XElement doc=XElement.Load("c:\\yourXML.xml");
decimal totalPrice=doc.DescendantsAndSelf("Order")
.Where(x=>x.Attribute("id").Value==OrderID)
.Select(y=>y.Element("Items")).Elements("Item")
.Select(z=>decimal.Parse(z.Element("TotalCost").Value)).ToList().Sum();
return totalPrice;
}
但是,在评估时,该选择是否会将每个项目的总成本加起来?@nate-不,不会。但是您首先需要获得正确的路径。我的错误是我忘了添加根节点,它实际上是从OrderFeed开始的。您的方法返回一个int。它应该是decimalThanks谢谢您的帮助,这似乎是一种更简单的方法来迭代我的XML文件,而不必使用定义的路径。我唯一的问题是我想返回一个订单的所有项目的字符串(仍然是OrderID)。我尝试在“y”变量行的末尾添加.ToList(),并返回它,但出于某种原因,它只返回列表对象本身的一个实例。有什么建议吗?'System.Collections.Generic.List`1[System.Xml.Linq.XElement]@nate00234如果您想要字符串中的所有值,请使用
y=>y.Element(“Items”).Elements(“Item”).Value
public decimal GetTotalCostForAnOrder(int OrderID)
{
XElement doc=XElement.Load("c:\\yourXML.xml");
decimal totalPrice=doc.DescendantsAndSelf("Order")
.Where(x=>x.Attribute("id").Value==OrderID)
.Select(y=>y.Element("Items")).Elements("Item")
.Select(z=>decimal.Parse(z.Element("TotalCost").Value)).ToList().Sum();
return totalPrice;
}