我的文件XML:
<document xmlns="http://www.abbyy.com/FineReader_xml/FineReader10-schema-v1.xml" version="1.0" producer="ABBYY FineReader Engine 11" languages="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.abbyy.com/FineReader_xml/FineReader10-schema-v1.xml http://www.abbyy.com/FineReader_xml/FineReader10-schema-v1.xml">
<page width="1006" height="636" resolution="300" originalCoords="1" rotation="RotatedUpsidedown">
<block blockType="Text" blockName="" l="979" t="613" r="1006" b="636"><region><rect l="979" t="613" r="1006" b="636"/></region>
<text>
<par lineSpacing="890">
<line baseline="17" l="985" t="620" r="1006" b="636"><formatting lang="EnglishUnitedStates"><charParams l="985" t="620" r="1006" b="636" suspicious="1">r</charParams></formatting></line></par>
</text>
</block>
<block blockType="Barcode" blockName="" l="242" t="21" r="772" b="116"><region><rect l="242" t="21" r="772" b="116"/></region>
<text>
<par><line baseline="0" l="0" t="0" r="0" b="0"><formatting lang="">049102580225180310</formatting></line></par>
</text>
<barcodeInfo type="INTERLEAVED25"/>
</block>
</page>
</document>
我想要<formatting>..</formatting>
我试试这段代码:
XElement racine = XElement.Load("test_XML.xml");
var query = from xx in racine.Elements(XName.Get("block"))
select new
{
CodeBar= xx.Attribute(XName.Get("formatting")).Value
};
但我没有什么
答案 0 :(得分:0)
这里有几个问题:
您的XML在根节点中有一个默认命名空间:
<document xmlns="http://www.abbyy.com/FineReader_xml/FineReader10-schema-v1.xml" version="1.0"
因此,所有子元素都在此命名空间中,因此在按Name
查询元素时,必须在构造要搜索的XName
时使用相应的命名空间。
<formatting>
个节点不是<block>
个节点的直接子节点,它们嵌套在多个XML级别中。此外,它们是XML元素,而不是XML属性。
同样,<block>
元素不是<document>
根元素的直接子元素,它们嵌套在<page>
元素中。
在这种情况下,XElement.Descendants(name)
可用于按名称查找嵌套元素。
因此您的查询应该是:
var ns = racine.Name.Namespace; // The root default namespace used by all the elements in the XML.
var query = from block in racine.Descendants(ns + "block")
from formatting in block.Descendants(ns + "formatting")
select new
{
CodeBar= (string)formatting,
};
示例fiddle,用于输出两个<formatting>
元素的值:
{ CodeBar = r }
{ CodeBar = 049102580225180310 }
答案 1 :(得分:0)
这是一个控制台程序,它获取第二个格式(lang ='')节点。
using System;
using System.Xml;
namespace ConsoleApplication1 {
class Program {
static void Main(string[] args) {
XmlDocument xml = new XmlDocument();
xml.Load("c:\\temp\\test.xml");
NameTable nt = new NameTable();
XmlNamespaceManager nsmgr;
nsmgr = new XmlNamespaceManager(nt);
nsmgr.AddNamespace("html", xml.DocumentElement.NamespaceURI);
XmlNode ndFormat = xml.SelectSingleNode("//html:formatting[@lang='']", nsmgr);
if (ndFormat != null) {
Console.WriteLine(ndFormat.InnerText);
}
}
}
}