这是我拥有的XML文件的一小部分。
我可以读取所需的内容,例如可以获取类型和消息等。但是,在PreflightResultEntry部分之一中,有一组名为Var的元素,我需要使用“ <Var name="NumPages">8</Var>
”
--
<PreflightResultEntry type="GeneralDocInfo">
<PreflightResultEntryMessage xml:lang="en-US">
<Message>457834a.pdf </Message>
<StringContext>
<BaseString>%FileInfo%</BaseString>
<Const name="Category">GeneralDocInfo</Const>
<Const name="ActionID">-1</Const>
<Instance>
<Var name="FileInfo">
<Var name="DIPath">/V/PitStop/Testing/Mike/Processed Docs on Success/457834a.pdf</Var>
<Var name="CreationDate">D:20120724153648-05'00'</Var>
<Var name="ModDate">D:20120725134534-04'00'</Var>
<Var name="Producer">Adobe PDF Library 10.0</Var>
<Var name="Creator">Acrobat PDFMaker 10.1 for Word</Var>
<Var name="Author">DOL Comments</Var>
<Var name="Title"/>
<Var name="Subject"/>
<Var name="Keywords"/>
<Var name="Trapped">1</Var>
<Var name="NumPages">8</Var>
<Var name="Major">1</Var>
<Var name="Minor">5</Var>
<Var name="WasRepairedOnOpen">0</Var>
<Var name="IsLinearized">0</Var>
<Var name="ContainsThumbnails">0</Var>
<Var name="LeftToRightReading">1</Var>
<Var name="ContainsJobTicket">0</Var>
<Var name="EncryptionType">1</Var>
<Var name="Permissions">-1</Var>
<Var name="PrinergyTraps">3</Var>
</Var>
<Location page="-1"/>
</Instance>
</StringContext>
</PreflightResultEntryMessage>
</PreflightResultEntry>
---
在这里,我得到的适用于消息和类型的内容
List<PitStopMessage> messages = XDocument.Load(file)
.Descendants("PreflightResultEntryMessage")
.Where(x => x.Parent != null )
.Select(x => new PitStopMessage()
{
message = x.Element("Message").Value,
type = x.Parent.Attribute("type").Value,
xmllevel = x.Parent.Attribute("level") != null ? x.Parent.Attribute("level").Value : String.Empty,
link = 0
}).ToList();
只有在父元素PreflightResultEntry中退出时,我才需要对元素var进行新查询
这是我到目前为止所拥有的,但是给了我一个错误“对象引用未设置为对象的实例”。这表明我在寻找什么(元素)不存在。
List<PitStopPages> messages = XDocument.Load(file)
.Descendants("PreflightResultEntryMessage")
.Where(x => x.Parent != null && x.Parent.Attribute("type").Value == "GeneralDocInfo" && x.Parent.Element("Var").Value == "NumPages")
.Select(x => new PitStopPages()
{
Pages = x.Parent.Attribute("name").Value
}).ToList();
如果您从逻辑上通读您的查询,则可能会发现错误。
您的查询正在尝试查找:
PreflightResultEntryMessage
type
属性为GeneralDocInfo
Var
具有的值NumPages
name
属性值问题是最后两个部分。Parent
在您所有情况下都是PreflightResultEntry
要素。PreflightResultEntry
没有任何子Var
元素,没有Var
元素具有value NumPages
,并且PreflightResultEntry
没有name
属性。这些中的任何一个都将导致空引用异常(您所看到的异常)。
最好是从上至下进行处理,而不是先查找一个元素然后再查找其父元素。所以:
PreflightResultEntry
具有type
的属性GeneralDocInfo
Var
元素的name
属性为NumPages
所以:
var numPages = (int)XDocument.Load(file)
.Descendants("PreflightResultEntry")
.Where(x => (string) x.Attribute("type") == "GeneralDocInfo")
.Descendants("Var")
.Single(x => (string) x.Attribute("name") == "NumPages");
请参阅此小提琴以获得有效的演示。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句