简体   繁体   English

C#LinQ to XML创建输出

[英]C# LinQ to XML create output

What I'm doing here is converting the omnipage xml to alto xml. 我在这里所做的是将omnipage xml转换为alto xml。 So I decided to use C#. 因此,我决定使用C#。

And here is my sample XML file 这是我的示例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>

And here is my code 这是我的代码

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();

My question is, it works when I use a simple XML like in the above, but when I use a long XML like this in the link 我的问题是,当我使用上述类似的简单XML时,它会起作用,但是当我在链接中使用此类的长XML时,它将起作用。

http://pastebin.com/LmDHRzC5

it doesn't work? 它行不通吗?

But it also has a wd tag and it also has a L attribute. 但是它也具有wd标签,并且还具有L属性。

Thank you. 谢谢。 I paste the long XML in the pastebin because its too long. 我将长XML粘贴到pastebin中,因为它太长了。

You have a namespace on your larger document 您在较大的文档上有一个名称空间

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

the following works 以下作品

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

Or you can use another option from Search XDocument using LINQ without knowing the namespace 或者,您可以使用LINQSearch XDocument中使用另一个选项, 而无需知道名称空间

I'm not going to do all the code but this should get you started. 我不会执行所有代码,但这应该可以帮助您入门。 I used xml linq 我用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