从大型XML文件中提取信息

时间:2015-03-10 00:09:16

标签: xml

我需要从大型xml文件中获取一些网址。

Xml文件具有以下结构。

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

......     

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

4 个答案:

答案 0 :(得分:2)

如果您安装了Perl(或者您可以安装它),则可以使用xml_grep附带的xml_grep --text_only URL product_file.xml > url.txt (可在XML::Twig中找到)或Activestate Perl或当然是关于centOS)。

{{1}}

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

答案 1 :(得分:0)

你只需要网址吗?

给定的结构看起来像是与图像/产品数据相关联的网址?如果您不关心其他数据并且只需要所有网址,那么应该采用正则表达式

答案 2 :(得分: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);

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

// 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写入文本文件。

让我知道我还能做些什么来帮助你。

答案 3 :(得分:0)

如何使用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。

我希望有所帮助。