【发布时间】:2018-08-28 19:46:32
【问题描述】:
我目前正在寻找一种在 Perl 中将以下输出写入 XML 文件的方法
-
h1是父级 -
h2是h1的子级 -
h3是h2的子级(或h1的子级)等。
示例输入
<h1>1 Top level heading
Para text 1
Para text 2
<h2>1.1 Sub level heading
Para text 3
Para text 4
<h3>1.1.1 Sub sub level heading
Para text 5
Para text 6
<h2>Sub level heading 2
Para text 7
Para text 8
<h1>Top level heading
Para text 1
Para text 2
需要的输出
<h1>
<label>1</label>
<title>Top level heading</title>
<p>Para text 1</p>
<p>Para text 2</p>
<h2>
<label>1.1</label>
<title>Sub level heading</title>
<p>Para text 3</p>
<p>Para text 4</p>
<h3>
<label>1.1</label>
<title>Sub sub level heading</title>
<p>Para text 5</p>
<p>Para text 6</p>
</h3>
</h2>
<h2>Sub level heading (no number prefix)
<p>Para text 7</p>
<p>Para text 8</p>
</h2>
</h1>
<h1>Top level heading (no number prefix)
<p>Para text 9</p>
<p>Para text 10</p>
</h1>
我尝试了很多,但没有找到实现这一目标的逻辑。
有人可以帮我开始吗?
更新
@Borodin的代码基于上述输入sn-p运行良好,但我的实际要求如下:
输入.txt
<art>Ärticle Title
<smry>1 Summåry
Summary paragragh 1...
Summary paragragh 2...
</smry>
<subjg>Subject Group Title
subject 1; subject 2; subject 3
</subjg>
<h1>1 Top level heading
Para text 1
<img gr1.jpg>
Para text 2
<h2>1.1 Sub level heading
Para text 3
Para text 4
<img gr2.jpg>
<h2>1.2 Sub level heading
Para text 5
Para text 6
<h3>1.1.1 Sub sub level heading
Para text 7
<fcap>Label 1: Text...
<grp line1.png>
Para text 8
<h3>1.1.2 Sub sub level heading
Para text 9
Para text 10
<h2>Sub level heading
<fcap>Text only...
<grp line2.png>
Para text 11
Para text 12
<h1>Top level heading
Para text 13
Para text 14
<h2>Sub level heading
Para text 15
Para text 16
<blst>Books
[1] Book name 1...
[2] Book name 2...
[3] Book name 3...
</blst>
<art>
...
<art>
...
必需的输出.xml
<?xml version="1.0" encoding="UTF-8"?>
<article>
<front>
<title>Ärticle Title</title>
<summary>
<label>1</label>
<title>Summåry</title>
<p>Summary paragragh 1...</p>
<p>Summary paragragh 2...</p>
</summary>
<subj-group>
<title>Subject Group Title</title>
<sub>subject 1</sub>
<sub>subject 2</sub>
<sub>subject 3</sub>
</subj-group>
</front>
<body>
<h1 id="s1">
<label>1</label>
<title>Top level heading</title>
<p>Para text 1</p>
<img src="gr1.jpg" id="gr1"/>
<p>Para text 2</p>
<h2 id="s1a">
<label>1.1</label>
<title>Sub level heading</title>
<p>Para text 3</p>
<p>Para text 4</p>
<img src="gr2.jpg" id="gr2"/>
</h2>
<h2 id="s1b">
<label>1.2</label>
<title>Sub level heading</title>
<p>Para text 5</p>
<p>Para text 6</p>
<h3 id="s1b1">
<label>1.1.1</label>
<title>Sub sub level heading</title>
<p>Para text 7</p>
<figure id="grp1">
<label>Label 1:</label>
<cap><p>Text...</p></cap>
<graphic src="line1.png"/>
</figure>
<p>Para text 8</p>
</h3>
<h3 id="s1b2">
<label>1.1.2</label>
<title>Sub sub level heading</title>
<p>Para text 9</p>
<p>Para text 10</p>
</h3>
</h2>
<h2 id="s1c">
<title>Sub level heading 2</title>
<figure id="grp2">
<cap><p>Text only...</p></cap>
<graphic src="line2.png"/>
</figure>
<p>Para text 11</p>
<p>Para text 12</p>
</h2>
</h1>
<h1 id="s2">
<title>Top level heading</title>
<p>Para text 13</p>
<p>Para text 14</p>
<h2 id="s2a">
<title>Sub level heading 2</title>
<p>Para text 15</p>
<p>Para text 16</p>
</h2>
</h1>
</body>
<back>
<booklist>
<title>Books</title>
<bookname id="b1"><l>[1]</l><t>Book name 1...</t></bookname>
<bookname id="b2"><l>[2]</l><t>Book name 2...</t></bookname>
<bookname id="b3"><l>[3]</l><t>Book name 3...</t></bookname>
</booklist>
</back>
</article>
有人可以帮我解决这个问题吗?
【问题讨论】:
-
如何生成 XML?通过直接
print、使用模板或使用诸如XML::LibXML、XML::Twig或XML::Simple之类的模块?一些代码尝试将有助于显示您尝试了什么以及它如何没有达到您的预期。 -
你的输入是 HTML 吗?真的没有关闭
</h1等标签吗?这样做的唯一方法是为h1->h2->h3层次结构显式编码,因为它在 HTML 中没有任何含义。您的输入数据应该格式更好。 -
这很难正确完成。您需要保留一堆打开的标题级别,并在每次出现优于当前标题的新标题时以相反的顺序关闭它们。然后所有标题必须在最后关闭。
-
一般用一个库,XML::LibXML确实不错;搜索 SO 帖子以了解如何使用它编写新的 XML(这里是 one example)。如果您的输入确实来自(不完整的)HTML 文件,那么正如@Borodin 所说,这很困难;看看他们的答案。