繁体   English   中英

C#LinQ to XML创建输出

[英]C# LinQ to XML create output

我在这里所做的是将omnipage xml转换为alto xml。 因此,我决定使用C#。

这是我的示例XML文件

<wd l="821" t="283" r="1363" b="394">
<ch l="821" t="312" r="878" b="394" conf="158">n</ch>
<ch l="888" t="312" r="950" b="394" conf="158">o</ch>
<ch l="955" t="283" r="979" b="394" conf="158">i</ch>
<ch l="989" t="312" r="1046" b="394" conf="158">e</ch>
<ch l="1051" t="312" r="1147" b="394" conf="158">m</ch>
<ch l="1157" t="283" r="1219" b="394" conf="158">b</ch>
<ch l="1224" t="312" r="1267" b="394" conf="198">r</ch>
<ch l="1267" t="283" r="1296" b="394" conf="198">i</ch>
<ch l="1306" t="312" r="1363" b="394" conf="158">e</ch>
</wd>

这是我的代码

XDocument document = XDocument.Load(fileName);
var coordinates = from r in document.Descendants("wd").ToList().Where
                  (r => (string)r.Attribute("l") != "")
                  select new
                  {
                      left = r.Attribute("l").Value,
                  };

foreach (var item in coordinates)
{
    Console.WriteLine(item.left);
}
Console.ReadLine();

我的问题是,当我使用上述类似的简单XML时,它会起作用,但是当我在链接中使用此类的长XML时,它将起作用。

http://pastebin.com/LmDHRzC5

它行不通吗?

但是它也具有wd标签,并且还具有L属性。

谢谢。 我将长XML粘贴到pastebin中,因为它太长了。

您在较大的文档上有一个名称空间

<document xmlns="http://www.scansoft.com/omnipage/xml/ssdoc-schema3.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

以下作品

document.Descendants().Where(e => e.Name.LocalName == "wd")

或者,您可以使用LINQSearch XDocument中使用另一个选项, 而无需知道名称空间

我不会执行所有代码,但这应该可以帮助您入门。 我用xml linq

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            StreamReader reader = new StreamReader(FILENAME);
            //skip xml identification with UTF-16
            reader.ReadLine();
            XDocument doc = XDocument.Load(reader);

            XElement body = doc.Descendants().Where(x => x.Name.LocalName == "body").FirstOrDefault();
            XNamespace ns = body.GetDefaultNamespace();

            var results = new {
                sections = body.Elements(ns + "section").Select(x => new {
                    l = (int)x.Attribute("l"),
                    r = (int)x.Attribute("r"),
                    b = (int)x.Attribute("b"),
                    runs = x.Descendants(ns + "run").Select(y => new {
                        wds = y.Elements(ns + "wd").Select(z => new {
                            chs = z.Elements(ns + "ch").Select(a => new {
                                l = (int?)a.Attribute("l"),
                                t = (int?)a.Attribute("t"),
                                r = (int?)a.Attribute("r"),
                                b = (int?)a.Attribute("b"),
                                conf = (int?)a.Attribute("conf"),
                                value = (string)a
                            }).ToList()
                        }).ToList()
                    }).ToList()
                }).ToList(),
                dds = body.Elements(ns + "dd").Select(x => new {
                    l = (int)x.Attribute("l"),
                    r = (int)x.Attribute("r"),
                    b = (int)x.Attribute("b"),
                    paras = x.Elements(ns + "para").Select(y => new {
                        lns = y.Elements(ns + "ln").Select(z => new {
                            wds = z.Elements(ns + "wd").Select(a => new {
                                chs = a.Elements(ns + "ch").Select(b => new {
                                    l = (int?)b.Attribute("l"),
                                    t = (int?)b.Attribute("t"),
                                    r = (int?)b.Attribute("r"),
                                    b = (int?)b.Attribute("b"),
                                    conf = (int?)b.Attribute("conf"),
                                    value = (string)b
                                }).ToList()
                            }).ToList()
                        }).ToList()
                    }).ToList()
                }).ToList(),

            };
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM