如何从xml文件中的多个节点获取数据使用c#在不同的文本文件中使用它们?

时间:2017-11-07 05:58:01

标签: c# xml linq-to-xml

我有一个示例xml文件,如下所示

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Publishing DTD with OASIS Tables v1.0 20120330//EN" "JATS-journalpublishing-oasis-article1.dtd">
<article article-type="proceedings" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:oasis="http://www.niso.org/standards/z39-96/ns/oasis-exchange/table">
<front>
<journal-meta>
<journal-id journal-id-type="publisher-id"/>
<journal-title-group>
<journal-title>Eleventh International Conference on Correlation Optics</journal-title>
</journal-title-group>
<issn pub-type="epub">0277-786X</issn>
<publisher>
<publisher-name>SPIE</publisher-name>
</publisher>
</journal-meta>
<article-meta>
<article-id pub-id-type="doi">10.236/12.205210</article-id>
<title-group>
<article-title>So you think you can dance?</article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<name>
<surname>Cena</surname>
<given-names>John</given-names>
</name>
<xref ref-type="aff" rid="a1"><sup>a</sup></xref>
</contrib>
<contrib contrib-type="author" corresp="yes">
<name>
<surname>Pal</surname>
<given-names>G.S.</given-names>
</name>
<xref ref-type="aff" rid="a2"><sup>b</sup></xref>
</contrib>
<aff id="a1"><label><sup>a</sup></label>CNRS, France</aff>
<aff id="a2"><label><sup>b</sup></label>MIT, USA</aff>
</contrib-group>
</article-meta>
</front>
<body>
<sec id="S1">
<label>1.</label>
<p>Today is your lucky day</p>
</sec>
<sec id="S2">
<label>2.</label>
<p>Today is not so lucky</p>
</sec>
</body>
</article>

我想要获取某些节点的内容(找到第一个节点)并将它们放入变量中,然后使用regex替换它们以有效的方式在不同的TXT文件中使用它们。 我正在尝试像

这样的东西
 XDocument doc=XDocument.Load(@"D:\MyFiles\1235-12-3053\230\124\124.xml",LoadOptions.PreserveWhitespace);
                var s=from a in doc.Descendants("surname")
                    select a.First();
                var l=from x in doc.Descendants("label")
                    select x.First();
            ... so on
    File.WriteAllText(@"C:\Desktop\text.txt", Regex.Replace(File.ReadAllText(@"C:\Desktop\text.txt"), @"<a>[^<]+</a>", @"<a>s</a>"));
    File.WriteAllText(@"C:\Desktop\text.txt", Regex.Replace(File.ReadAllText(@"C:\Desktop\text.txt"), @"<b>[^<]+</b>", @"<b>l</b>"));
    ... so on

但是First()方法给出了错误,并且多次使用WriteAllText,这是一个好习惯吗?我可以一次进行多次替换吗?

2 个答案:

答案 0 :(得分:0)

您应该考虑将文本加载到变量(字符串),而不是将文件多次加载并保存到硬盘驱动器。

当我记忆时你可以使用正则表达式来搜索和替换多个不同的模式,并在完成后保存文件。

答案 1 :(得分:0)

尝试这样的事情

XDocument doc=XDocument.Load(file,LoadOptions.PreserveWhitespace);
    var s=(from a in doc.Descendants("surname")
     select a).First().Value;
    var l=(from x in doc.Descendants("label")
     select x).First().Value;
 string text = File.ReadAllText(file);
            text = Regex.Replace(text,  @"<a>[^<]+</a>", @"<a>"+s+@"</a>");
            text = Regex.Replace(text,  @"<b>[^<]+</b>", @"<b>"+l+@"</b>");
            File.WriteAllText(file, text);

如果我从这个程序中正确理解了你想要的东西,那就应该这样做。

还有一种名为UpdateText的方法,我相信,要对文件进行更新,但我对它并不熟悉......也许其他人可以帮助你解决这个问题。