C# XPath不能正确使用XFA
我有一个动态PDF表单,它有一个下拉列表。我正在使用iTextSharp尝试在发送到客户端之前修改PDF中的值。以下是我正在尝试的,正如中的一个答案: 但无论我使用什么XPath表达式(例如:C# XPath不能正确使用XFA,c#,pdf,xpath,itextsharp,xfa,C#,Pdf,Xpath,Itextsharp,Xfa,我有一个动态PDF表单,它有一个下拉列表。我正在使用iTextSharp尝试在发送到客户端之前修改PDF中的值。以下是我正在尝试的,正如中的一个答案: 但无论我使用什么XPath表达式(例如://subform或字段[@name='DropDownList1']),SelectSingleNode始终返回null,并且SelectNodes返回空列表 我做错什么了吗?如果有更好的方法,我很想知道 下面是一些xml(我想要字段节点): 下拉列表 项目1 项目2 项目3 10.0.2.201202
//subform
或字段[@name='DropDownList1']
),SelectSingleNode
始终返回null
,并且SelectNodes
返回空列表
我做错什么了吗?如果有更好的方法,我很想知道
下面是一些xml(我想要字段节点):
下拉列表
项目1
项目2
项目3
10.0.2.20120224.1.869952.867557
XPath不起作用的原因是大部分XML都在命名空间中http://www.xfa.org/schema/xfa-template/3.0/
在这种情况下,适当的做法是创建XmlNamespaceManager
并声明名称空间,然后在XPath中使用它们。请看我的解释
PdfReader reader = new PdfReader(myPdfPath);
XmlDocument xdoc = reader.AcroFields.Xfa.DomDocument;
XmlNamespaceManager nsm = new XmlNamespaceManager(xdoc.NameTable);
nsm.AddNamespace("xfa", "http://www.xfa.org/schema/xfa-template/3.0/");
XmlNode dropdown =
xdoc.SelectSingleNode("/*/xfa:template/xfa:subform[@name='form1']/xfa:subform[@name='form2']/xfa:field[@name='DropDownList1']",
nsm);
我也没有看到名为“form2”的
子表单
元素。这是您没有包含在XML示例中的一部分吗?请发布一个您将从中提取的XML示例,以及输入/输出expected@JWiley当然,只是用打字错误编辑了一下。当我试着测试它时注意到了。非常好用,谢谢!
<?xml version="1.0" encoding="UTF-8"?>
<xdp:xdp xmlns:xdp="http://ns.adobe.com/xdp/" timeStamp="2013-01-18T13:22:31Z" uuid="3c6141a4-56b4-4f6e-8a2d-4519050f1c69">
<template xmlns="http://www.xfa.org/schema/xfa-template/3.0/">
<?formServer defaultPDFRenderFormat acrobat9.1dynamic?>
<subform name="form1" layout="tb" locale="en_US" restoreState="auto">
<pageSet>
<pageArea name="Page1" id="Page1">
<contentArea x="0.25in" y="0.25in" w="576pt" h="756pt"/>
<medium stock="default" short="612pt" long="792pt"/> <?templateDesigner expand 0?>
</pageArea>
<?templateDesigner expand 0?>
</pageSet>
<subform w="576pt" h="756pt" name="form2">
<field name="DropDownList1" y="22.225mm" x="6.35mm" w="62mm" h="9mm">
<ui>
<choiceList>
<border>
<edge stroke="lowered"/>
</border>
<margin/>
</choiceList>
</ui>
<font typeface="Myriad Pro"/>
<margin topInset="1mm" bottomInset="1mm" leftInset="1mm" rightInset="1mm"/>
<para vAlign="middle"/>
<caption reserve="25mm">
<para vAlign="middle"/>
<value>
<text>Drop-down List</text>
</value>
</caption>
<items save="1">
<text>Item 1</text>
<text>Item 2</text>
<text>Item 3</text>
</items>
</field>
</subform>
<proto/>
<desc>
<text name="version">10.0.2.20120224.1.869952.867557</text>
</desc>
<?templateDesigner expand 1?>
<?renderCache.subset "Myriad Pro" 0 0 ISO-8859-1 4 112 28 0001000E001200130023002400250027002D0033003500420044004500460049004A004C004D004F00500051005300540055005600580059 -12BCDFLRTacdehiklnoprstuwx?>
</subform>
<?templateDesigner DefaultPreviewDynamic 1?>
<?templateDesigner DefaultRunAt client?>
<?templateDesigner Grid show:1, snap:1, units:0, color:ff8080, origin:(0,0), interval:(125000,125000)?>
<?templateDesigner DefaultCaptionFontSettings face:Myriad Pro;size:10;weight:normal;style:normal?>
<?templateDesigner DefaultValueFontSettings face:Myriad Pro;size:10;weight:normal;style:normal?>
<?templateDesigner DefaultLanguage JavaScript?>
<?acrobat JavaScript strictScoping?>
<?templateDesigner WidowOrphanControl 0?>
<?templateDesigner SaveTaggedPDF 1?>
<?templateDesigner SavePDFWithEmbeddedFonts 1?>
<?templateDesigner FormTargetVersion 30?>
<?templateDesigner Rulers horizontal:1, vertical:1, guidelines:1, crosshairs:0?>
<?templateDesigner Zoom 92?>
</template>
<xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve">
<annots/>
</xfdf>
<datasets xmlns:xfa="http://www.xfa.org/schema/xfa-data/1.0/"></datasets>
</xdp:xdp>
PdfReader reader = new PdfReader(myPdfPath);
XmlDocument xdoc = reader.AcroFields.Xfa.DomDocument;
XmlNamespaceManager nsm = new XmlNamespaceManager(xdoc.NameTable);
nsm.AddNamespace("xfa", "http://www.xfa.org/schema/xfa-template/3.0/");
XmlNode dropdown =
xdoc.SelectSingleNode("/*/xfa:template/xfa:subform[@name='form1']/xfa:subform[@name='form2']/xfa:field[@name='DropDownList1']",
nsm);