从大型XML文件提取信息

3

我需要从一个大的 XML 文件中获取一些 URL。

XML 文件的结构如下。

<Main>
 <Product>
  <Images>
   <URL>image1.jpg</URL>
   <URL>image2.jpg</URL>
   <URL>image3.jpg</URL>
   <URL>image4.jpg</URL>
  </Images>
 </Product>

......

我需要将所有链接提取到一个文本文件中。有没有关于如何做到这一点的想法 /?


你是在编写一个程序来完成这个任务,还是在寻找一个能够完成它的工具? - Dour High Arch
一个工具会很棒。 - CARASS
你需要告诉我们你正在使用什么操作系统。 - Dour High Arch
我使用Windows,但我也可以访问CentOS VPS。 - CARASS
4个回答

3
如果您已经安装了Perl(或者您可以安装它),您可以使用xml_grep命令,该命令包含在XML::Twig中(可在Activestate PerlStrawberry Perl或当然也可以在CentOS上获取)。请注意保留HTML标记。
xml_grep --text_only URL product_file.xml > url.txt

它可以处理非常大的文件,因为它在流模式下工作。

1
如何使用XPath来检索所需的节点?然后,您可以将该列表的内容写入文本文件中。以下是一些C#代码,应该可以为您完成此任务:
public static void Main(string[] Arguments)
{
    XmlDocument oXmlDocument = new XmlDocument();
    oXmlDocument.Load(@"XmlFile.xml");

    using (StreamWriter oStreamWriter = new StreamWriter(File.OpenWrite(@"Output.txt")))
    {
        XmlNodeList oXmlNodeList = oXmlDocument.SelectNodes("//URL");

        oXmlNodeList.OfType<XmlNode>().ToList<XmlNode>().ForEach(m => oStreamWriter.WriteLine(m.InnerText));
    }
}

如果文档很大,考虑使用SAX方法而不是DOM。希望这有所帮助。

0
以下是一个示例,应该可以加载您粘贴的XML。您需要添加System.Xml.Linq,因为它使用LINQ to XML。首先,我们使用XDocument.Load(...)加载XML文档:
// Load the raw XML into an XDocument.
var doc = XDocument.Load(new StringReader(@"<Main>
 <Product>
  <Images>
   <URL>image1.jpg</URL>
   <URL>image2.jpg</URL>
   <URL>image3.jpg</URL>
   <URL>image4.jpg</URL>
  </Images>
 </Product>
</Main>"));

我使用了一个 StringReader 和示例字符串,但你应该将其更改为加载您的 XML 文件的内容。例如,XDocument.Load("C:\folder\file.xml") 将加载一个文件(请参见XDocument.Load(string)).
// Create a list to store the URLs in.
var urls = new List<string>();

// Get the <Main> element.
var mainNode = doc.Element("Main");

// Loop through the <Product> elements...
foreach (var productNode in mainNode.Elements("Product"))
{
    // Loop through the <Images> elements (if there's more than one).
    foreach (var imagesNode in productNode.Elements("Images"))
    {
        // Loop through the <URL> elements...
        foreach (var urlNode in imagesNode.Elements("URL"))
        {
            // The "Value" property is the text within the element.
            urls.Add(urlNode.Value);
        }
    }
}

// Write the URLs out to the Debug output.
foreach (var url in urls)
    Debug.WriteLine(url);

此时,您将拥有一个URL列表。如果您想将它们写入文件,这是一个示例:

// Create an output file.
using(var outputFile = File.Create("output.txt"))
{
    var writer = new StreamWriter(outputFile);
    foreach (var url in urls)
        writer.WriteLine(url);
}

你不一定需要像我那样创建列表并将其写入文件--你可以在读取它们时将URL直接写入文本文件中。

如果还有其他需要帮助的地方,请告诉我。


0

你只需要URL吗?

给定的结构看起来像是URL与图像/产品数据相关联的?如果你不关心其他数据,只需要所有的URL,那么正则表达式应该是最好的选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接