【问题标题】:Get Resutls from XML with more than one line从超过一行的 XML 中获取结果
【发布时间】:2015-11-21 09:51:40
【问题描述】:

我想为每个订单获取订单行并将它们作为表格带到电子邮件正文中

值 1 |价值 2 |价值 3

12345 ABC X1_

XML 代码:

<?xml version="1.0" encoding="utf-8"?><UniversalInterchange xmlns= "http://www.designworker/namespace" version="1.1">
    <Header> </Header>
    <Body>
        <UniversalShipment xmlns="http://www.designworker/namespace" version="1.1">
            <Shipment>
                <DataContext>
                    <DataTargetCollection>
                        <DataTarget>
                            <Type>SMTPTYPE</Type>
                        </DataTarget>
                    </DataTargetCollection>
                </DataContext>
                <Order>
                    <OrderNumber>99348234234</OrderNumber>
                    <OrderLineCollection>
                        <OrderLine>
                            <LineNumber>1</LineNumber> 
                            <OrderedQty>455.000</OrderedQty>
                            <OrderedQtyUnit>
                                <Code>MORE</Code>
                            </OrderedQtyUnit>
                            <Product>
                                <Code>999LAM01</Code> 
                                <Description>New Design Work</Description>
                            </Product>
                            <QuantityMet>1.000</QuantityMet> 
                            <ShortfallQuantity>0</ShortfallQuantity> 
                        </OrderLine>
                        <OrderLine>
                            <LineNumber>2</LineNumber> 
                            <OrderedQty>655.000</OrderedQty>
                            <OrderedQtyUnit>
                                <Code>SOME</Code>
                            </OrderedQtyUnit>
                            <Product>
                                <Code>999LAM02</Code> 
                                <Description>OLD Design Work </Description>
                            </Product>
                            <QuantityMet>3.000</QuantityMet> 
                            <ShortfallQuantity>45</ShortfallQuantity> 
                        </OrderLine>
                    </OrderLineCollection>
                </Order>
            </Shipment>
        </UniversalShipment>
    </Body>
</UniversalInterchange>

我试图用这段代码解决这个问题:

var xDoc = XDocument.Parse(xmlValue);
            XNamespace nsp = ns;
            try
            {
                var value = xDoc
                    .Element(nsp + "UniversalInterchange")
                    .Element(nsp + "Body")
                    .Element(nsp + "UniversalShipment")
                    .Element(nsp + "Order")
                    .Element(nsp + "OrderLine")
                    .Element(nsp + "LineNumber")
                    .Value;
                return value;

但是当我在订单中有不止一行时,它就不起作用了。 我怎样才能以更好的方式解决这个问题?

【问题讨论】:

  • 还有元素。然后我会从订单中获得所有行吗?
  • var orderLines = [...].Elements(nsp + "OrderLine"); var lineNumbers = orderLines.SelectMany(ol =&gt; ol.Element(nsp + "LineNumber")); var lineNumberValues = lineNumbers.SelectMany(ln =&gt; ln.Value);
  • 看起来不错,但我需要一行中的行号和产品代码,下一行号和下一个产品代码是一个新行
  • 1.创建一个小类来存储您需要的来自订单行的数据(行号和产品代码)。 2. 创建List&lt;ThatClass&gt;foreach(var orderLine in orderLines) { \\ create a new object of ThatClass, fill it with the info of the current orderLine and then add it to the list }。 3. 对于您想要的每一行,遍历列表中的所有项目,连接该行中您想要的一个属性的值,以 newLine 结束。

标签: c# xml


【解决方案1】:

看起来导航路径缺少一些 .Element() 调用。

var orderLines = xDoc
   .Element(nsp + "UniversalInterchange")
   .Element(nsp + "Body")
   .Element(nsp + "UniversalShipment")
   .Element(nsp + "Shipment")
   .Element(nsp + "Order")
   .Element(nsp + "OrderLineCollection")
   .Elements(nsp + "OrderLine");

// 1, 2
var lineNumbers = orderLines.Select(x => x.Element(nsp + "LineNumber").Value);

只要找不到元素,就会从 .Element() 返回 null。如果您希望有多个条目,您还应该使用 .Elements() 而不是 .Element()。

【讨论】:

  • c# ':' 字符十六进制值 0x3a 不能包含在名称中,当我这样做时会出现
猜你喜欢
  • 1970-01-01
  • 2021-03-04
  • 2018-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-31
  • 2021-05-12
  • 1970-01-01
相关资源
最近更新 更多