简体   繁体   English

从 XLIFF 文件 C# 中解析 XML object

[英]Parse XML object from XLIFF file C#

I am trying to Parse XML object with two namespaces inside the file.我正在尝试使用文件内的两个命名空间来解析 XML object。

> <xliff srcLang="en" version="23.0"
> xmlns="asd:asd:asd:asd:xliff:document:23.0"
> xmlns:mda="asd:asd:asd:asd:xliff:document:23.0">   
<file id="f"
> original="someUrl">
>     <unit id="1" name="air">
>       <mda:data>
>         <mda:group category="attributes">
>           <mda:meta type="id">Color</mda:meta>
>           <mda:meta type="abbr">I_AI_LOW</mda:meta>
>           <mda:meta type="type">Message</mda:meta>
>         </mda:group>
>       </mda:data>
>       <segment>
>         <source>Too many messages for 1 minute</source>
>       </segment>
>     </unit>   
</file> 
</xliff>

I want to take the value from unit id="1" name="air " from property name, " mda:meta type="type" property type and source>Too many messages for 1 minute - property segment . I want to assign their value to other properties, so basically to extract their value.我想从属性名称、“ mda:meta type="type" 属性类型源>Too many messages for 1 minute - property segment中获取unit id="1" name="air " 的值。我想分配它们的值要其他属性,所以基本上要提取它们的值。

My code now is:我现在的代码是:

 xliff = XDocument.Load(Path.GetFullPath(filePath));
 var ns = xliff.Root!.Name.Namespace;

 var elements = xliff.Descendants()
            .Elements(ns + "unit").ToList();

//this part not working
XElement tempElement = elements.Descendants(XName.Get("mda:metadata", 
ns.ToString())).FirstOrDefault()!;

I know that somehow I have to access the second namespace, but I don't know how to do it.我知道我必须以某种方式访问第二个命名空间,但我不知道该怎么做。 Any help here will be appreciated.这里的任何帮助将不胜感激。

Try using XNamespace and LINQ尝试使用XNamespaceLINQ

XNamespace ns1 = "asd:asd:asd:asd:xliff:document:23.0";
XNamespace ns2 = "asd:asd:asd:asd:xliff:document:23.0";

var type_value = xliff.Descendants(ns1 + "unit")
    .Descendants(ns2 + "meta")
    .Where(x => (string)x.Attribute("type") == "type")
    .Select(y => y.Value)
    .FirstOrDefault()
    .ToString();

OR (to get all values to list)或(要列出所有值)

var elements =  xliff.Descendants(ns1 + "unit")
    .Descendants(ns2 + "meta")
    .Where(x => (string)x.Attribute("type") == "type")
    .Select(y => y.Value.ToString())
    .ToList();

OR (to get source from segment)或(从段获取源)

var nameSegment = xliff.Descendants(ns1 + "unit")
    .Descendants(ns1 + "segment")
    .Select(x => x.Element(ns1 + "source").Value)
    .ToList();

Try following:尝试以下操作:

            XDocument xliff = XDocument.Load(Path.GetFullPath(filePath));
            XNamespace ns = xliff.Root.GetDefaultNamespace();
            XNamespace nsMda = xliff.Root.GetNamespaceOfPrefix("mda");

            List<XElement> elements = xliff.Descendants(ns + "unit").ToList();

            //this part not working
            List<XElement> metaData = elements.Descendants(nsMda +  "metadata").ToList(); 

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

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