繁体   English   中英

Xml SelectSingleNode() 返回 null

[英]Xml SelectSingleNode() returns null

我在这个论坛上搜索了类似的问题,但遗憾的是,所有答案对我来说都没有帮助,MSDN 文档也没有。

我创建了一个 TETML XML 文件,它是 PDF 文件的摘录。 正如标题所示,我想 select 一个节点。 最后我想直接把go放到“Pages”节点,方便以后浏览。 我的尝试都没有成功。 即使我尝试简单地移动到 Root 元素,我也没有成功:

请参阅显示代码和结果的 Visual Studio 中的调试

代码如下:

XmlDocument doc = new XmlDocument();
doc.LoadXml(FileRelatedOperations.ReadAllTextOfFile(filename, true, null));
XmlNamespaceManager nsMgr = new XmlNamespaceManager(doc.NameTable);
nsMgr.AddNamespace("t", "http://www.pdflib.com/XML/TET5/TET-5.0.xsd");

// No success with any of them:
doc.SelectSingleNode("TET");
doc.SelectSingleNode("/TET");
doc.SelectSingleNode("//TET");
doc.SelectSingleNode("t:TET", nsMgr);
doc.SelectSingleNode("/t:TET", nsMgr);
doc.SelectSingleNode("//t:TET", nsMgr);
doc.DocumentElement.SelectSingleNode("t:TET", nsMgr);
doc.DocumentElement.SelectSingleNode("/t:TET", nsMgr);
doc.DocumentElement.SelectSingleNode("//t:TET", nsMgr);

可能是什么原因? 我在有/没有 NamespaceManager 的情况下进行了尝试。

这是原始版本的缩写 XML:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Created by the PDFlib Text and Image Extraction Toolkit TET (www.pdflib.com) -->
<TET xmlns="http://www.pdflib.com/XML/TET5/TET-5.0"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.pdflib.com/XML/TET5/TET-5.0
 http://www.pdflib.com/XML/TET5/TET-5.0.xsd"
 version="5.1">
    <Creation platform="Win32" tetVersion="5.1" date="2020-06-15T10:54:14+02:00" />
    <Document filename="C:\Temp\AnyPdfFile.pdf" pageCount="8" filesize="379366" linearized="false" pdfVersion="1.4" destination="D0">
        <DocInfo>
            <Author>Doxis4</Author>
            <CreationDate>2020-02-03T10:45:02+01:00</CreationDate>
            <Creator>Doxis4 Java API 7.4.2-r202829 (PDFDevice, ITextInterface)</Creator>
            <ModDate>2020-02-03T10:45:02+01:00</ModDate>
            <Producer>iText 2.1.7 by 1T3XT</Producer>
            <Title>Doxis4 Dokument</Title>
        </DocInfo>
        <Options>tetml={filename={C:\Temp\AnyPdfFile.pdf.xml}}</Options>
        <Action type="GoTo" trigger="open"/>
        <Pages>
            <Page number="1" width="595.00" height="842.00">
                <Options>layouthint={header=true} contentanalysis={bidilevel=ltr punctuationbreaks=false} docstyle=papers structureanalysis={list=true} layoutanalysis={layoutdetect=2 layoutrowhint={full separation=preservecolumns}} layouteffort=high granularity=word</Options>
                <Content granularity="word" dehyphenation="false" dropcap="false" font="false" geometry="false" shadow="false" sub="false" sup="false">
                    <Para>
                        <A id="A0" type="start"/>
                        <Box llx="40.00" lly="768.10" urx="315.40" ury="777.10">
                            <Word>
                                <Text>SomeTextHere</Text>
                                <Box llx="40.00" lly="768.10" urx="115.60" ury="777.10"/>
                            </Word>
                        </Box>
                    </Para>
                </Content>
            </Page>
        </Pages>
    </Document>
</TET>

先感谢您:-)!

你试过的很好,但是xmlns对应的默认NameSpacehttp://www.pdflib.com/XML/TET5/TET-5.0不是http://www.pdflib.com/XML/TET5/TET- 5.0.xsd ,修改代码为:

1 - 声明和XmlNamespaceManager

XmlDocument doc = new XmlDocument();
doc.LoadXml(FileRelatedOperations.ReadAllTextOfFile(filename, true, null));

XmlNamespaceManager nsMgr = new XmlNamespaceManager(doc.NameTable);
nsMgr.AddNamespace("t", "http://www.pdflib.com/XML/TET5/TET-5.0");

nsMgr.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
nsMgr.AddNamespace("schemaLocation", "http://www.pdflib.com/XML/TET5/TET-5.0 http://www.pdflib.com/XML/TET5/TET-5.0.xsd");

请注意,如果您只想 select TET ,则不需要xsischemaLocation命名空间声明。

2 - SelectSingleNode with /t:TET and t is http://www.pdflib.com/XML/TET5/TET-5.0

XmlNode tetNode = doc.SelectSingleNode("/t:TET", nsMgr);

我希望你觉得这有帮助。

暂无
暂无

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

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