2016-12-05 66 views
2

我在這裏做的是將omnipage xml轉換爲alto xml。所以我決定使用C#。C#LinQ到XML創建輸出

這裏是我的示例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中,因爲它太長了。

+0

你是什麼意思,「它不工作」?是否有錯誤,如果是,哪一個? – Sefe

回答

2

你有你的文件較大命名空間

<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") 

或者你可以使用從Search XDocument using LINQ without knowing the namespace

+0

非常感謝。有效。 –

+0

我還有一個問題,我需要得到的座標環 裏面的foreach(在座標VAR項目)的每個通道標記的內容 {// 我需要做什麼,在這裏做 } –

+0

@pdftoimage到獲取它們的值,chs = r.Descendants()。其中​​(e => e.Name.LocalName ==「ch」)。選擇(n => n.Value).ToArray()'然後打印出來,'Console.WriteLine(item.left +「:」+ String.Join(「,」,item.chs));' –

1

另一種選擇,我不會做所有的代碼,但這應該讓你開始。我用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(), 

      }; 
     } 
    } 
}