【问题标题】:How to get input from a webservice如何从 Web 服务获取输入
【发布时间】:2012-10-27 17:26:00
【问题描述】:

我正在尝试编写一个程序,该程序将接收来自 Web 服务的输入并选择与订单 ID 一起出现的正确信息。我正在为此使用 xPath,因为它是必需的。例如,如果我在运行程序时在 OrderID 下输入 1,它应该提取该订单的总成本并显示它。我知道我的代码肯定有问题,因为我是新手,所以当我无法控制正在使用的变量时,我不知道如何物理地获取输入。任何帮助将不胜感激,谢谢!

这是我的代码:

[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>

这是我在输出中遇到的错误:

System.Xml.XPath.XPathException: Expression must evaluate to a node-set.
at System.Xml.XPath.XPathNavigator.Select(XPathExpression expr)
at System.Xml.XPath.XPathNavigator.Select(String xpath)
at Lab3.Service1.GetTotalCostForAnOrder(Int32 OrderID) in C:\

【问题讨论】:

  • 你的方法返回一个整数。它应该是十进制

标签: c# xml xpath xpathnavigator


【解决方案1】:

以下行似乎不正确:

String searchString = "sum(OrderFeed/Order/Items/Item/TotalCost)";

这应该是选择节点的 XPath 表达式,但您的 XML 中没有 OrderFeed 节点 - 根节点是 Order

这作为节点集合应该会带来更好的结果:

String searchString = "/Order/Items/Item/TotalCost";

【讨论】:

  • 但该选择是否会在评估时将每个项目的总成本值相加?
  • @nate - 不,它不会。但你首先需要找到正确的路径。
  • 我的错我忘了添加根节点,它实际上是从 OrderFeed 开始的
【解决方案2】:

你应该使用 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;
}

【讨论】:

  • 感谢您的帮助,这似乎是一种更简单的方式来遍历我的 XML 文件,而无需使用已定义的路径。我唯一的问题是我想返回一个订单的所有项目的字符串(仍然是 OrderID)。我尝试在 'y' 变量行的末尾添加 .ToList() 并返回它,但由于某种原因它只返回列表对象本身的一个实例。有什么建议吗?
  • 'System.Collections.Generic.List`1[System.Xml.Linq.XElement]'
  • @nate00234 如果您希望订单的所有值都在字符串中,请使用y=&gt;y.Element("Items")).Elements("Item").Value
猜你喜欢
  • 1970-01-01
  • 2013-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-25
  • 1970-01-01
相关资源
最近更新 更多