如何转义来自simplexml_load_file的数据

时间:2016-01-14 19:46:30

标签: xml simplexml cdata

CREATE PROCEDURE dbo.SetHistoricPrices

AS
BEGIN
  SET NOCOUNT ON;

  DECLARE @minId INT
         ,@ProductId INT
         ,@CostPrice MONEY
         ,@daysToAdd INT

  SET @daysToAdd =
  (
  CASE
    WHEN DATEPART(dw, GETDATE()) = 1 THEN 5
    WHEN DATEPART(dw, GETDATE()) = 2 THEN 4
    WHEN DATEPART(dw, GETDATE()) = 3 THEN 3
    WHEN DATEPART(dw, GETDATE()) = 4 THEN 2
    WHEN DATEPART(dw, GETDATE()) = 5 THEN 1
    WHEN DATEPART(dw, GETDATE()) = 6 THEN 0
    WHEN DATEPART(dw, GETDATE()) = 7 THEN -1

  END
  )

  SELECT
    @minId = MIN(ProductId)
  FROM Products p
  WHILE @minId IS NOT NULL
  BEGIN
    SELECT
      @ProductId = p.ProductId
    FROM Products p
    WHERE p.ProductId = @minId

    SELECT
      @CostPrice = p.CostPrice
    FROM Products p
    WHERE p.ProductId = @minId

    INSERT INTO HistoricProductPrices
      VALUES (@ProductId, DATEADD(DAY, @daysToAdd, GETDATE()), @CostPrice, DATEADD(DAY, 0, GETDATE()))

    SELECT
      @minId = MIN(ProductId)
    FROM Products
    WHERE @minId < ProductId
  END

END

GO

这是我从第三方数据库中提取的简单信息。我们开始提出评论部分,其中包含&amp;和一些&lt;这是对xml构建的限制。错误是:

simplexml_load_file($htmlstring)

在尝试构建XML集之前,我怎样才能获得那些格式错误的结果和CDATA。我已经遍布http://php.net/manual/en/function.simplexml-load-file.php,但似乎没有聪明才能找到解决方案!

1 个答案:

答案 0 :(得分:1)

如果输入文件无效,并且您无法影响第三方修复输入文件,则您的选项相当有限。

可能值得尝试的一件事是使用DOM in HTML mode加载文件。这使用了更宽容的解析器,但随后创建了相同的数据结构。

好的一点是,你实际上不必使用DOM的所有详细程度,因为你can "import" the DOM object into SimpleXML。这不需要任何重新解析,因为两个接口在内部使用相同的数据结构(libxml)。

从那里 - 假设这有效 - 你可以继续,就像你刚开始运行simplexml_load_file一样。

所以不要这样:

$sxml = simplexml_load_file($file_path);

你写的是:

$dom = DOMDocument::loadHTMLFile($file_path);
$sxml = simplexml_import_dom($dom);

然后按原样继续。

(如果您有一串数据而不是文件路径,则分别使用simplexml_load_string()DOMDocument::loadHTML()。)