PB如何解析XML文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PB如何解析XML文件相关的知识,希望对你有一定的参考价值。

PB如何解析XML文件,比如我文件放在C盘根目录下,1.xml 如何通过PB读入文件并且解析里面的内容。最好有例子

可以使用文件读取的方式,你先把C盘中的1.XML文件读入到一个字符型变量中,然后使用FIND的方式,查找XML文件的关键字定位,然后使用MID函数字符串截取的方式来截取XML文件中的值。
假设我的1.xml有如下内容
<pk_corp>0001</pk_corp>

//将文件读入ls_text
string ls_text
li_FileNum = FileOpen("C:\1.xml", StreamMode!)
FileRead(li_FileNum, ls_text)
FileClose(li_FileNum)

//利用POS截取
long ll_start_pos, ll_end_pos
ll_start_pos = Pos( ls_text, "<pk_corp>", 1 )
ll_end_pos = Pos( ls_text, “</pk_corp>", 1 )

-------得到内容
string ls_value
ls_value = mid(ls_text, ll_start_pos + 9, ll_end_pos - ll_start_pos - 9)

这样可以得到ls_value = '0001'
参考技术A 一般都是直接通过数据窗口导出xml。然后再倒入xml为PB导入导出数据的一大课题,
如果您感兴趣我可以给您提供完整代码和指导.每个xml中的模板格式都是不同的,如果是通过pb数据窗口导出的 是根据数据窗口设计画板(就是编剧数据窗口的画板中)最下方的导出模板设置的..如果不是也是有规律可循的. 你要根据其中的段落来进行导出 .
大致的顺序是 (获得文件路径和文件名)(打开文件,获得该文件句柄)GetFileOpenName() -(利用句柄打开文件所有数据)fileopen()- fileread() 然后再根据代码段标识符!用Mid截取你所需要的那一段数据.
具体事例代码如下:
假设1.xml文件有如下内容
<dj>750</dj>
//选择路径
string ls_filename//文件名
stringls_fullname//完整路径+文件名
long li_filenum
If GetFileOpenName ("请选择文件", ls_fullname, ls_Filename,"XML", "all Files (*.XML),*.XML",docname) < 1 THEN
RETURN
ELSE
ls_fullname = Trim(ls_fullname)
END IF
ls_filename = lower(ls_filename)//小写文件(一般存成的文件读取是.xml不是大写的.XML)
li_FileNum = FileOpen(ls_fullname,StreamMode!,Read!,LockWrite!)
FileRead(li_FileNum,ls_temp)

/利用POS截取
long ll_start, ll_end
ll_start = Pos( ls_text, "<dj>", 1 )
ll_end_ = Pos( ls_text, “</dj>", 1 )

//截取所获得内容
string ls_str
ls_str = mid(ls_temp,ll_start + 4,ll_end - 1)
//此时ls_str = '75'
参考技术B 学习一下PBDOM吧

如何使用 XmlNodeList 解析 XML 文件

【中文标题】如何使用 XmlNodeList 解析 XML 文件【英文标题】:How Can I Parse an XML file using XmlNodeList 【发布时间】:2019-10-18 17:24:45 【问题描述】:

我的任务是获取一个 XML 文件并将其转换为新的 XML。我没有使用 XML 文档的经验,但我已经能够使用下面显示的代码从第一个 XML 文档中获取一些数据。请注意,并非所有代码都只是一个小示例。

XmlDocument rssXmlDoc = new XmlDocument();
        // Load the RSS file from the RSS URL
        rssXmlDoc.Load("https://agency.governmentjobs.com/jobfeed.cfm?agency=ocso");

        // Setup name space
        XmlNamespaceManager nsmgr = new XmlNamespaceManager(rssXmlDoc.NameTable);
        nsmgr.AddNamespace("joblisting", "http://www.neogov.com/namespaces/JobListing");

        // Parse the Items in the RSS file
        XmlNodeList rssNodes = rssXmlDoc.SelectNodes("rss/channel/item/");

        // Iterate through the items in the RSS file
        foreach (XmlNode rssNode in rssNodes)
        

            XmlNode rssSubNode = rssNode.SelectSingleNode("title");
            string title = rssSubNode != null ? rssSubNode.InnerText : "";

使用此代码,我可以获得大部分元素。尝试从子元素获取数据时遇到了困难。我无法获取的 XML 部分如下所示。

<joblisting:department>Supply</joblisting:department>
                <guid isPermaLink="true">https://www.governmentjobs.com/careers/ocso/Jobs/2594527</guid>
                <joblisting:categories>
                      <joblisting:category xmlns:joblisting="http://www.neogov.com/namespaces/JobListing" xmlns:atom="http://www.w3.org/2005/Atom">
                        <CategoryCode>ClericalDataEntry</CategoryCode>
                        <Category>Clerical &amp; Data Entry</Category>
                      </joblisting:category>
                      <joblisting:category 
                </joblisting:categories>            

但我无法获得所有数据。如何获取以 guid isPermaLink="true"

开头的元素的值

对于 joblisting:categories 我使用了一个 foreach 循环来读取这些值

foreach (var item in rssSubNode.SelectNodes("joblisting:categories", nsmgr))
            
                rssSubNode = rssSubNode = rssNode.SelectSingleNode("joblisting:category", nsmgr);
                string category = rssSubNode != null ? rssSubNode.InnerText : "";
            

如何读取这些子元素的值?

【问题讨论】:

"...获取一个 XML 文件并将其转换为新的 XML..." 使用 XSLT 转换来实现更好、更容易。 【参考方案1】:

要读取 guid 节点,您可以使用以下代码。请注意,在节点中使用 selectSingleNode 包含“项目”节点。

public static void test() 
    XmlDocument rssXmlDoc = new XmlDocument();
    // Load the RSS file from the RSS URL
    rssXmlDoc.Load("https://agency.governmentjobs.com/jobfeed.cfm?agency=ocso");

    // Setup name space
    XmlNamespaceManager nsmgr = new XmlNamespaceManager(rssXmlDoc.NameTable);
    nsmgr.AddNamespace("joblisting", "http://www.neogov.com/namespaces/JobListing");

    // Parse the Items in the RSS file
    XmlNodeList rssNodes = rssXmlDoc.SelectNodes("rss/channel/item");


    // Iterate through the items in the RSS file
    foreach (XmlNode rssNode in rssNodes) 
        var xmlnode = rssNode.SelectSingleNode("guid ");
        System.Console.WriteLine("the value of guid is =>" + xmlnode.InnerText);

        XmlNode rssSubNode = rssNode.SelectSingleNode("title");
        string title = rssSubNode != null ? rssSubNode.InnerText : "";
    

【讨论】:

要读取子节点,您可以使用 foreach (XmlNode rssNodechild in rssNodes.ChildNodes)

以上是关于PB如何解析XML文件的主要内容,如果未能解决你的问题,请参考以下文章

解析xml文件,如何动态的封装成一个java类

如何使用 QXmlStreamReader 解析包含对其他 XML 文件的引用的 XML 文件?

如何使用 System.Xml.Linq 解析 xml 文件

如何解析 XML 文件? [关闭]

如何在文档中下载和保存 xml,然后如何从文档中解析 xml 文件?

如何解析XML文件